Что это за странный шаблон, который принимает <int N>
?
Объявление шаблона можно сделать для классов / типов, значений и указателей.Вы обычно не видите эту форму, так как определение шаблонов редко использует константы в параметрах шаблона.
Что это за второй странный шаблон <>?
Лучший способ думатьшаблона - сделать что-то похожее на то, что делает компилятор: рассматривать шаблон как класс, где вы заменяете параметр шаблона фактическим значением этого типа.
То есть для:
template <int N>
struct Factorial
{
enum { value = N * Factorial<N - 1>::value };
};
Factorial<2>::value
эквивалентно:
// generated by the compiler when Factorial<2>::value is encountered in code:
struct Factorial2 { enum { value = 2 * Factorial1::value }; };
struct Factorial1 { enum { value = 1 * Factorial0::value }; };
// not generated by compiler, as it was explicitly defined in the code you ask about:
template <> struct Factorial<0> { enum { value = 1 }; }; // defines Factorial<0>
Для чего нужны перечисления?
Они определяют перечисление с константой value
ввремя компиляции, позволяющее вам писать клиентский код, подобный тому, который показан в вашем примере.
В чем преимущество использования этого факторного вычисления по сравнению с обычным временем выполнения?
Преимуществоэто эффективность.Поскольку вычисление значения расширяется при компиляции, затраты времени выполнения Factorial<10>::value
такие же, как у Factorial <1> :: value.В скомпилированном коде они оба являются константами.Если вам нужно было вычислить факториал в критичном для производительности коде и вы знали во время компиляции, какое это значение, вы должны либо сделать это, либо рассчитать его в автономном режиме и определить константу с предварительно вычисленным значением в вашем коде.
Как часто вы, люди, используете это?
Является ли "этим" вы относитесь к рекурсивному вычислению константы?Если да, то не часто.
Является ли «это» определением констант в шаблонах?Очень часто:)
Является ли «это» специализацией шаблона для определенного типа?Очень очень очень частоЯ понял, что std :: vector имеет совершенно отдельную реализацию в некоторых реализациях STL (a std::vector<bool>
с 8 элементами не должен требовать более 1 байта для хранения значений).
Я использовалC ++ некоторое время, но никогда не использовал это раньше.На какой большой части C ++ я упускал?
Не обязательно большая часть.Если вы используете boost, вполне вероятно, что код, который вы используете, реализован с использованием подобных вещей.