Что это за странный шаблон, который принимает <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> :: значение. В скомпилированном коде они являются константами. Если вы должны были рассчитать факторный код, зависящий от производительности, и вы знали, что в момент компиляции это значение, вы должны либо сделать это, либо рассчитать его в автономном режиме, либо определить константу с предварительно рассчитанным значением в вашем коде.
Как часто вы путешествуете?
Является ли это «вы» ссылкой на рекурсивное вычисление константы? Если да, то не часто.
Является ли это «определение» констант в шаблонах? Очень часто :)
Является ли это «особенностью» шаблона для определенного типа? Очень Очень Очень часто. Я понял, что std :: vector имеет полностью отдельную реализацию в некоторых реализациях STL (для std::vector<bool>
с 8 элементами не требуется больше 1 байта для хранения значений).
Я использовал C++ какое-то время, , но никогда не использовал это раньше. Насколько большой часть C++ была упущена?
Не обязательно большая часть. Если вы используете boost, вероятно, что используемый вами код реализуется с помощью таких вещей.
http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – GManNickG