Задание 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. Иначе компиляция должна привести к пользовательскому сообщению об ошибке.