§ 5. Вариативные шаблоны
Задания
- Напишите функцию 
message, которая работает аналогично функцииprintf. Первый аргумент функции — поток, куда будут выводится символы. Второй аргумент функции — шаблон строки, которая отобразится на экране, в котором символом%обозначены места вставки объектов. Остальные аргументы функции — это объекты, которые нужно вставить на место%. Функция при вызове выводит сообщение на стандартный вывод. Например,message(std::cout, "% + % = %", 'a', 2, 3.0)
выведет на экранa + 2 = 3.- Функция должна быть реализована с помощью шаблона с произвольным количеством аргументов.
 - Напишите модульный тест, в котором проверяется корректность работы функции при несовпадении количества аргументов и количества 
%. Для сравнения актуального вывода с ожидаемым удобно использовать потокstd::stringstream, который осуществляет вывод в строку. - В этом задании запрещено использовать оператор "запятая". См. пример в конце.
 
 - Напишите функцию 
cat, которая соединяет произвольное количество массивов в один большой массив. Функция должна принимать произвольное количество аргументов и возвращать объект типаstd::array(это один из новых классов стандартной библиотеки C++, который представляет собой статический массив заданного размера). Пример вызова функции:std::array<float,3> vec1{1.0f,2.0f,3.0f}; std::array<float,3> vec2{4.0f,5.0f,6.0f}; std::array<float,6> r = cat(vec1, vec2); // 1 2 3 4 5 6
- Функция должна быть реализована с помощью шаблона с произвольным количеством аргументов в предположении, что все аргументы имеют тип 
std::array<T,N>(TиNодинаковы для всех аргументов функции). - Напишите модульный тест для проверки корректности работы функции.
 - Для выполнения задания вам может пригодиться оператор 
sizeof.... - В этом задании запрещено использовать оператор "запятая". См. пример в конце.
 
 - Функция должна быть реализована с помощью шаблона с произвольным количеством аргументов в предположении, что все аргументы имеют тип 
 Напишите функцию
tie, которая работает также какstd::tie, но для массивов, имеющих типstd::array<T,N>(реализовывать аналогstd::ignoreне нужно). Функция возвращает объект типаTie(название произвольное), у которого переопределен оператор присваивания:template <class T, int N, int M> struct Tie { void operator=(const std::array<T,N*M>& rhs); };
- Функция должна быть реализована с помощью шаблона с произвольным количеством аргументов в предположении, что все аргументы имеют тип 
std::array<T,N>(TиNодинаковы для всех аргументов функции). - Напишите модульный тест для проверки корректности работы функции.
 - В этом задании запрещено использовать оператор "запятая". См. пример в конце.
 
std::array<float,6> r{1.0f,2.0f,3.0f,4.0f,5.0f,6.0f}; std::array<float,3> vec1, vec2; tie(vec1, vec2) = r; // (1 2 3) (4 5 6)
- Функция должна быть реализована с помощью шаблона с произвольным количеством аргументов в предположении, что все аргументы имеют тип 
 
int dummy[sizeof...(Ts)] = { (std::cout << args, 0)... };