Понимание концепции и терминологии метапрограммирования шаблонов - PullRequest
0 голосов
/ 18 апреля 2019

Я перепробовал все источники, доступные в сети, и книги, которые не в состоянии понять концепции и синтаксис шаблона.

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
}

что такое value, которые ассоциируются с Factorial<4>::value почему нам нужно enum здесь. В чем разница между struct Factorial<0> и struct Factorial, почему, если я объявляю как struct Factorial<4>, почему это дает ошибку?

1 Ответ

2 голосов
/ 18 апреля 2019

что такое value, которое ассоциируется с Factorial<4>::value

Это член анонимного enum, и он инициализируется из расчета. Чтобы найти его значение, компилятор должен знать Factorial<3>::value, для которого требуется Factorial<2>::value, для которого требуется Factorial<1>::value, для которого требуется Factorial<0>::value.

В чем разница между struct Factorial<0> и struct Factorial

template <> struct Factorial<0> - это специализация базовой template <int N> struct Factorial, которая применяется только в том случае, если параметр шаблона int равен 0. Предоставление этого здесь останавливает бесконечный регресс, который в противном случае произошел бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...