Я задаюсь вопросом, что различие между использованием статической константы и перечислимым взломом при использовании шаблонных методов метапрограммирования.
EX: (Fibonacci через TMP)
template< int n > struct TMPFib {
static const int val =
TMPFib< n-1 >::val + TMPFib< n-2 >::val;
};
template<> struct TMPFib< 1 > {
static const int val = 1;
};
template<> struct TMPFib< 0 > {
static const int val = 0;
};
по сравнению с.
template< int n > struct TMPFib {
enum {
val = TMPFib< n-1 >::val + TMPFib< n-2 >::val
};
};
template<> struct TMPFib< 1 > {
enum { val = 1 };
};
template<> struct TMPFib< 0 > {
enum { val = 0 };
};
Почему использование один по другому? Я считал, что перечислимый взлом использовался, прежде чем статическая константа поддерживалась в классах, но почему использование он теперь?
enum in mums не прогнозируют, значения статическими элементами, а если передаются ссылкой на шаблон будет отличаться:
void f(const int&);
f(TMPFib<1>::value);
Если вы хотите сделать чистые расчеты времени компиляции и т. Д. Это нежелательный побочный эффект.
Основная историческая разница состоит в том, что Enums также работают для компиляторов, где в классе инициализации значений элементов не поддерживаются, это должно быть зафиксировано в большинстве компиляторов.
Также могут быть различия в скорости компиляции между Enum и Static Consts.
В руководящих принципах кодирования есть некоторые детали [112807069] и старая резьба в архивах повышения к предмету.
Для некоторого предыдущего может показаться меньше взлома, и более естественным. Также он имеет память, выделенную для себя, если вы используете класс, поэтому вы можете, например, принять адрес VAL.
Последнее лучше поддерживаться некоторыми старыми компиляторами.