Понимание концепций и терминологии метапрограммирования шаблонов

#c #c 11 #templates

#c #c 11 #шаблоны

Вопрос:

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

 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 , почему, если я объявляю like struct Factorial<4> , почему он выдает ошибку?

Комментарии:

1. Все источники? Неужели? Простите мой скептицизм, но опыт научил меня, что всякий раз, когда кто-то так говорит, это означает, что он попробовал один или два ужасно написанных поста в блоге и отказался от этого. Не могли бы вы подробнее рассказать о том, что вы пробовали? Вы читали эту документацию от boost ? Или книга, из которой она была извлечена, «Метапрограммирование шаблонов C » ?

2. Какую ошибку выдает «это» при попытке объявить struct Factorial<4> ? Как вы пытаетесь это объявить? Почему вы пытаетесь это объявить? (Более глубокое понимание ваших текущих концепций и неправильных представлений о шаблонах увеличит ваши шансы получить ответ, который поможет.)

3. Если вы ищете исчерпывающее введение в шаблоны, это, вероятно, слишком широкий вопрос для SO. Однако, если вы сосредоточитесь на одной проблеме (например, на ошибке), это может сделать ваш вопрос актуальным.

4. Задавайте по одному вопросу за раз и, пожалуйста, указывайте точные сообщения об ошибках, которые вы получили в вопросе

Ответ №1:

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 . Предоставление его здесь останавливает бесконечный регресс, который в противном случае произошел бы.

Комментарии:

1. будет ли это работать только для перечисления, я имею в виду, что вместо «значения», которое является перечислением, мы можем сделать его каким-то другим типом

2.Этого не должно быть enum , но это общепринятое и хорошо понятное явление. Это может быть static const int value = N * Factorial<N - 1>::value , или static constexpr int value = N * Factorial<N - 1>::value