模板元编程 - 使用Enum Hack和静态Const的区别

Ano*_*ous 54 c++ templates metaprogramming

我想知道在使用模板元编程技术时使用静态const和枚举黑客有什么区别.

EX :(斐波那契通过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;
};
Run Code Online (Sandbox Code Playgroud)

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 };
};
Run Code Online (Sandbox Code Playgroud)

为什么用一个而不是另一个?我已经读过枚举黑客是在类内部支持静态const之前使用的,但为什么现在使用呢?

Geo*_*che 36

枚举不是lvals,静态成员值是,如果通过引用传递,模板将被实例化:

void f(const int&);
f(TMPFib<1>::value);
Run Code Online (Sandbox Code Playgroud)

如果你想进行纯编译时计算等,这是一个不希望的副作用.

主要的历史差异是枚举也适用于不支持成员值的类内初始化的编译器,现在大多数编译器都应该修复它.
enum和static consts之间的编译速度也可能存在差异.

增强编码指南中有一些细节,并且有关该主题的增强存档中有一个较旧的主题.


Kor*_*icz 12

对于一些人来说,前者可能看起来不那么黑,而且更自然.如果你使用类,它也有为自己分配的内存,所以你可以拿取val的地址.

一些较旧的编译器可以更好地支持后者.

  • @Martin,关键字枚举与计算有什么关系?但要点 - 每个人都可以对此有自己的观点. (2认同)
  • 我也是一个枚举人。枚举本质上只是一个命名的整数常量,在这些情况下似乎可以满足我们的需求。这是一个右值,没有为其分配存储空间。一个“静态const int”已经为其分配了存储空间,而这一切都没有必要。 (2认同)