首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >模板元编程-使用Enum Hack和Static Const的区别

模板元编程-使用Enum Hack和Static Const的区别
EN

Stack Overflow用户
提问于 2010-02-01 01:47:54
回答 4查看 6.8K关注 0票数 57

我想知道在使用模板元编程技术时,使用静态常量和枚举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 };
};

为什么要使用一个而不是另一个呢?我读到过在类内部支持静态常量之前就使用过枚举攻击,但是为什么现在要使用它呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-01 02:22:05

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

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

如果你想做纯粹的编译时间计算等等,这是一个不受欢迎的副作用。

主要的历史区别是枚举也适用于不支持成员值类内初始化的编译器,这在大多数编译器中都应该得到修复。

枚举和静态常量在编译速度上也可能存在差异。

boost归档中的boost coding guidelinesolder thread中有一些关于该主题的详细信息。

票数 37
EN

Stack Overflow用户

发布于 2010-02-01 01:54:29

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

后者得到了一些较老的编译器的更好支持。

票数 12
EN

Stack Overflow用户

发布于 2013-09-22 12:39:25

另一方面,@Georg的答案是,当一个包含静态常量变量的结构被定义在一个专门的模板中时,它需要在源代码中声明,以便链接器可以找到它,并实际给它一个地址来引用它。这可能不必要地(取决于所需的效果)导致不雅的代码,特别是如果你试图创建一个只包含头文件的库。你可以通过将值转换为返回值的函数来解决这个问题,这也可能打开模板以获取运行时信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2172647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档