Рубрики

Шаблон метапрограммирования в C ++

Предсказать вывод следующей программы на C ++.

#include <iostream>

using namespace std;

  

template<int n> struct funStruct

{

    enum { val = 2*funStruct<n-1>::val };

};

  

template<> struct funStruct<0>

{

    enum { val = 1 };

};

  

int main()

{

    cout << funStruct<8>::val << endl;

    return 0;

}

Выход:

256

Программа рассчитывает «2 повышения до степени 8 (или 2 ^ 8)». Фактически, структура funStruct может использоваться для вычисления 2 ^ n для любого известного n (или константы n). Особенность вышеуказанной программы заключается в следующем: расчет выполняется во время компиляции . Итак, это компилятор, который вычисляет 2 ^ 8. Чтобы понять, как компилятор делает это, давайте рассмотрим следующие факты о шаблонах и перечислениях:

1) Мы можем передавать нестандартные параметры (параметры, которые не являются типами данных) шаблонам классов / функций.
2) Как и другие выражения const, значения констант перечисления оцениваются во время компиляции.
3) Когда компилятор видит новый аргумент шаблона, компилятор создает новый экземпляр шаблона.

Давайте внимательнее посмотрим на оригинальную программу. Когда компилятор видит funStruct :: val , он пытается создать экземпляр funStruct с параметром как 8, оказывается, что funStruct также должен быть создан, поскольку константа перечисления val должна быть оценена во время компиляции. Для funStruct компилятору нужен funStruct и так далее. Наконец, компилятор использует funStruct :: val и рекурсия времени компиляции завершается. Таким образом, используя шаблоны, мы можем писать программы, которые выполняют вычисления во время компиляции, такие программы называются шаблонными метапрограммами . Метапрограммирование шаблонов фактически является полным по Тьюрингу , что означает, что любое вычисление, выражаемое компьютерной программой, может быть вычислено в некоторой форме с помощью шаблонной метапрограммы. Шаблон метапрограммирования обычно не используется в практических программах, хотя это интересная концепция.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Шаблон метапрограммирования в C ++

0.00 (0%) 0 votes