Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Создав Жизнь, мы доказали сами себе полноценность шаблонов С++ как языка
Собственно говоря, никто не сомневается в полноте по Тьюрингу шаблонов С++ и возможности написать на них хоть чёрта лысого.Я вроде бы написал на них рекурсивную функцию вычисления факториала, но порядок раскрытия и редукции шаблонов не позволяет вычислить результат её применения :(
template <int N>
struct fact {
static const int value = N * fact<N-1>::value;
};
template <>
struct fact<1> {
static const int value = 1;
};
int fact_5 = fact<5>::value; // = 120
К счастью, в С++11 появился оператор decltype, который буквально означает «какой тип вернула бы функция, если бы мы ее вызвали». Применим его к tuple_cat и… убедимся, что tuple_cat все-таки принимает не голый тип «tuple», которым мы везде оперируем, а значение tuple. К счастью, в С++ имеется класс declval, который позволяет нам сделать вид, что значение все же существует, но его нельзя нигде использовать именно как значение. Этого достаточно.
Жизнь во время компиляции