在编译时检测模板存在

问题描述:

GCC高达4.5没有标准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> 
{ }; 

由于move构造函数只对的C++ 0x无论如何,如果我不介意使用其他的C++ 0x的上述定义的功能,所有可能的。

+3

大多数Boost是在头文件中实现的,而不是在对象文件中实现的。因此,如果你坚持这些,那么对于你不使用的东西 - 对于你所使用的大多数东西 - 对于这个问题,你都不会支付大小的惩罚。 – 2010-05-09 15:25:02

+0

更多的是依赖(即使几乎每个人都使用Boost)。也许我可以撕掉Boost的相关部分,但是因为我的图书馆总是像3头... – doublep 2010-05-09 15:42:20

+0

似乎很难检查一个类型是否存在。但是,如果没有移动构造函数,C++ 0x通常不会自动回退到复制?或者,如果缺乏部分很重要,难道想象一个复制比移动更安全的课程(如果后者没有被标记为不移动)是不是很难? – UncleBens 2010-05-09 20:29:48

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

除此之外,您可以测试编译器版本宏(__GNUC__ and __GNUC_MINOR__)以确定存在性,如果不存在则将其存根。不幸的是,似乎has_nothrow_move_constructor在G ++的任何发布版本中都不被支持,所以在你知道使用正确的版本之前,你必须等一下。