在编译时检测模板的存在

时间:2010-05-09 15:10:01

标签: c++ configuration templates c++11

高达4.5的GCC没有标准的C ++ 0x类型特征模板has_nothrow_move_constructor。我可以在我的包中使用它进行优化,但我不想排除其中一个常见的编译器,也不希望使用HAVE_STD_HAS_NOTHROW_MOVE_CONSTRUCTOR之类的符号重载配置。是否可以使用该模板(如果存在),如果不存在而不使用使用任何预定义的配置符号,则回退到复制?我也不想依赖Boost,因为我的库很小,并且由于其他原因不需要Boost。

在伪代码中,我需要类似的东西:

template <typename type>
struct has_nothrow_move_constructor_robust
  : public integral_constant <bool,
           /* if possible */  has_nothrow_move_constructor <type>::value
           /* otherwise   */  false>
{ };

由于移动构造函数仅适用于C ++ 0x,因此我不介意使用其他C ++ 0x功能进行上述定义,如果可能的话。

1 个答案:

答案 0 :(得分:1)

boost::variant有一个has_nothrow_move的实现供自己内部使用 - 你可以使用它,虽然它不像正确的编译器实现那样可靠。它的来源是here - 我不知道它有多可靠,所以YMMV。

除此之外,您可以测试编译器版本宏(__GNUC__ and __GNUC_MINOR__)以确定存在,如果不存在则将其存根。不幸的是,G ++的任何已发布版本似乎都不支持has_nothrow_move_constructor,因此您必须等待一段时间才能知道要使用的正确版本。