Вот пример из википедии, который отображает метапрограммирование на C ++:
template <int N>
struct Factorial
{
enum { value = N * Factorial<N - 1>::value };
};
template <>
struct Factorial<0>
{
enum { value = 1 };
};
// Factorial<4>::value == 24
// Factorial<0>::value == 1
void foo()
{
int x = Factorial<4>::value; // == 24
int y = Factorial<0>::value; // == 1
}
Я понимаю, как это работает, рекурсивно создавая типы Factorial со значениями параметров шаблона для N, пока не будет найдена специализация <0>, что позволяет компилятору разрешать значения в цепочке.
Мой вопрос: как это будет выглядеть после компиляции?Будет ли компилятор буквально просто генерировать что-то вроде:
int x = 24;
int y = 1;
или результат будет более сложным?Я спрашиваю, потому что мне интересно, если это в основном приводит к тому, что
Factorial<4>::value
заменяется на константу (24) в исполняемом коде или если он более сложный, чем это.Я просто пытаюсь понять, как это помогает повысить эффективность завершенной программы, так что это очень поможет:)