#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