Основы метапрограммирования на шаблонах
От: x-code  
Дата: 30.03.20 08:04
Оценка:
Задумался над тем, что лежит в основе метапрограммирования на шаблонах в С++.
И получилось примерно вот это:
* явная специализация шаблонов позволяет делать "ветвления"
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) позволяют извлекать дополнительную информацию из компилятора, которая в некоторых случаях используется для управления специализацией и тем самым "ветвлениями" и "циклами"

как добавка, без которой тоже можно, но которая в некоторых случаях добавляет удобства
* шаблоны с переменным числом параметров
* концепты формально введены все-же не для метапрограммирования, а для типизации самих шаблонов, чтобы нельзя было передать любую фигню в шаблон, на это не рассчитанный. Хотя кто знает, как их станут использовать?

Все ли я учел или что-то упустил?
Отредактировано 30.03.2020 8:05 x-code . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.