我想知道在使用模板元编程技术时,使用静态常量和枚举hack有什么不同。
例如:(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 };
};
为什么要使用一个而不是另一个呢?我读到过在类内部支持静态常量之前就使用过枚举攻击,但是为什么现在要使用它呢?
发布于 2010-02-01 02:22:05
枚举不是左数,静态成员值是,如果通过引用传递,模板将被实例化:
void f(const int&);
f(TMPFib<1>::value);
如果你想做纯粹的编译时间计算等等,这是一个不受欢迎的副作用。
主要的历史区别是枚举也适用于不支持成员值类内初始化的编译器,这在大多数编译器中都应该得到修复。
枚举和静态常量在编译速度上也可能存在差异。
boost归档中的boost coding guidelines和older thread中有一些关于该主题的详细信息。
发布于 2010-02-01 01:54:29
对一些人来说,前者可能看起来不那么像黑客,而更自然。如果你使用这个类,它也有为自己分配的内存,所以你可以获取val的地址。
后者得到了一些较老的编译器的更好支持。
发布于 2013-09-22 12:39:25
另一方面,@Georg的答案是,当一个包含静态常量变量的结构被定义在一个专门的模板中时,它需要在源代码中声明,以便链接器可以找到它,并实际给它一个地址来引用它。这可能不必要地(取决于所需的效果)导致不雅的代码,特别是如果你试图创建一个只包含头文件的库。你可以通过将值转换为返回值的函数来解决这个问题,这也可能打开模板以获取运行时信息。
https://stackoverflow.com/questions/2172647
复制相似问题