Шаблонное метапрограммирование - различие между Использованием перечислимого взлома и статической константой

Я задаюсь вопросом, что различие между использованием статической константы и перечислимым взломом при использовании шаблонных методов метапрограммирования.

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 };
};

Почему использование один по другому? Я считал, что перечислимый взлом использовался, прежде чем статическая константа поддерживалась в классах, но почему использование он теперь?

54
задан Georg Fritzsche 31 January 2010 в 08:26
поделиться

2 ответа

enum in mums не прогнозируют, значения статическими элементами, а если передаются ссылкой на шаблон будет отличаться:

void f(const int&);
f(TMPFib<1>::value);

Если вы хотите сделать чистые расчеты времени компиляции и т. Д. Это нежелательный побочный эффект.

Основная историческая разница состоит в том, что Enums также работают для компиляторов, где в классе инициализации значений элементов не поддерживаются, это должно быть зафиксировано в большинстве компиляторов.
Также могут быть различия в скорости компиляции между Enum и Static Consts.

В руководящих принципах кодирования есть некоторые детали [112807069] и старая резьба в архивах повышения к предмету.

36
ответ дан 7 November 2019 в 08:10
поделиться

Для некоторого предыдущего может показаться меньше взлома, и более естественным. Также он имеет память, выделенную для себя, если вы используете класс, поэтому вы можете, например, принять адрес VAL.

Последнее лучше поддерживаться некоторыми старыми компиляторами.

12
ответ дан 7 November 2019 в 08:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: