Задание 3 (идивидуальное): использование метафункций из type_traits
Указания:
- В этом задании необходимо использовать метафункции из стандартного заголовочного файла
<type_traits>
. - Для реализации вариантов шаблонов необходимо использовать принцип SFINAE.
- В функции
main()
необходимо протестировать разработанные шаблоны с достаточным количеством тестов, покрывающих основные случаи использования этих шаблонов.
Реализовать шаблонную функцию с шаблонным параметром-типом
T
и обычным параметром типаconst T &
и возвращающей указатель наconst T
. Если типT
является конструируемым по умолчанию, функция должна вернуть адрес статической локальной переменной, сконструированной по умолчанию. Иначе, если типT
является конструируемым от копии, функция должна вернуть адрес статической локальной переменной, сконструированной копией параметра функции. Иначе функция должна вернуть адрес своего параметра.Реализовать шаблонную функцию с шаблонным параметром-типом
T
и двумя обычными параметрами типовconst T &
иT &
. Если типT
является типом POD, функция должна скопировать содержимое первого своего параметра во второй при помощи функцииstd::memcpy()
. Иначе, если типT
является присваиваемым от копии, функция должна присвоить второму параметру значение первого. Иначе компиляция должна привести к пользовательскому сообщению об ошибке.Реализовать шаблонный класс с шаблонным параметром-типом
T
и полемi
типаint
(«счётчик заполненности массива», изначально равный 0). Если типT
является массивом, определить внутри класса поле-массив типаT
и методadd()
, получающий ссылку на константное значение типа «элемент массиваT
» и присваивающийi
-му элементу массива это значение, с последующим увеличениемi
. Иначе внутри класса нужно определить поле-массив из 100 элементов типаT
и методadd()
, получающий параметр типаconst T &
и выполняющий те же действия, что и в предыдущем случае.Реализовать шаблонный класс с шаблонным параметром-типом
T
. Если типT
является полиморфным классом или указателем на полиморфный класс, необходимо в шаблонном классе определить поле-список из указателей на такие классы. В деструкторе шаблонного класса необходимо обойти список и удалить каждый из объектов, указатель на который хранится в списке, при помощи операцииdelete
. Иначе если типT
является конструируемым копией или перемещением, в шаблонном классе определить поле-вектор из таких типов. Иначе компиляция должна привести к пользовательскому сообщению об ошибке. В обоих правильных случаях в классе необходимо объявить методadd()
, получающий либо указатель на полиморфный объект, либо типconst T &
и добавляющий его копию в контейнер.Реализовать шаблонную функцию с двумя шаблонными параметрами-типами
T1
иT2
и без обычных параметров. Если типыT1
иT2
одинаковые и конструируемые по умолчанию, функция должна вернуть указатель на объект типаT1
, созданный в динамической памяти и проинициализированный конструктором по умолчанию. Иначе если типыT1
иT2
являются полиморфными классами, типT2
конструируем по умолчанию и является производным отT1
, то функция должна вернуть указатель наT1
, ссылающийся на объект типаT2
, созданный в динамической памяти при помощи конструктора по умолчанию. Иначе если выполняются те же условия кроме того, что, наоборот, типT1
является производным отT2
и конструируем по умолчанию, тогда функция должна вернуть указатель наT2
, ссылающийся наT1
. Иначе компиляция должна привести к пользовательскому сообщению об ошибке.