Задумался над тем, что лежит в основе метапрограммирования на шаблонах в С++.
И получилось примерно вот это:
* явная специализация шаблонов позволяет делать "ветвления"
template<class T, class S>
struct IsSame { static const bool value = false; };
template<class T>
struct IsSame <T, T> { static const bool value = true; };
* правило SFINAE позволяет отбрасывать некоторый код и управлять специализацией шаблонов в зависимости от каких-то условий времени компиляции, тоже помогая в реализации ветвлений
template <bool condition, typename Type>
struct EnableIf;
template <typename Type>
struct EnableIf<true, Type>
{
using type = Type;
};
* рекурсивные шаблоны позволяют делать "циклы"
template <int N>
struct Factorial
{
enum { value = N * Factorial<N - 1>::value };
};
template <>
struct Factorial<0>
{
enum { value = 1 };
};
* операторы получения метаинформации времени компиляции (sizeof и decltype) позволяют извлекать дополнительную информацию из компилятора, которая в некоторых случаях используется для управления специализацией и тем самым "ветвлениями" и "циклами"
как добавка, без которой тоже можно, но которая в некоторых случаях добавляет удобства
* шаблоны с переменным числом параметров
* концепты формально введены все-же не для метапрограммирования, а для типизации самих шаблонов, чтобы нельзя было передать любую фигню в шаблон, на это не рассчитанный. Хотя кто знает, как их станут использовать?
Все ли я учел или что-то упустил?
Здравствуйте, x-code, Вы писали:
XC>Задумался над тем, что лежит в основе метапрограммирования на шаблонах в С++.
Как минимум
полиморфизм. Хотя способ реализации разный, но это общая черта
объектно-ориентированного и
обобщённого программирования.
Здравствуйте, x-code, Вы писали:
XC>Задумался над тем, что лежит в основе метапрограммирования на шаблонах в С++.
...
XC>Все ли я учел или что-то упустил?
Главное забыл: тех кто продолжает упорно грызть кактусы.