如何为C ++ 0x / 11和非C ++ 0x / 11制作标头?

时间:2014-02-21 00:37:52

标签: c++ c++11

我想为C ++ 0x / 11和非C ++ 0x / 11创建一个标头,以便它具有向后兼容性:

class Foo{
public:
  Foo(){}
  Foo(Foo&){}
#ifdef CXX0X //How to make it work here?
  Foo(Foo&&){}
#endif
};

2 个答案:

答案 0 :(得分:2)

我会看一下boost配置库。它适用于库编写者,并且有许多宏来处理C ++编译器版本和实现细节。即使你知道它是一个C ++ 11编译器,你仍然需要知道一些一致性细节 - boost配置会告诉你。这是文档的链接:

  

http://www.boost.org/doc/libs/1_55_0/libs/config/doc/html/index.html

答案 1 :(得分:2)

我建议不要检查__cplusplus,因为MSVC或GCC都没有将它提升到201103L,并且两者都支持r值参考几年。

您可以依靠编译器特定的宏来执行您想要的操作:

但是,这样做有一些缺点。由于宏是特定于编译器的,并且目标是支持多个编译器,因此需要将它们包装在另一个宏中。此外,有人说最终会删除__GXX_EXPERIMENTAL_CXX0X__

因此,最好使用像Boost.Config这样的预建工具。它已经为宏BOOST_NO_RVALUE_REFERENCES提供了此功能。

您的示例将读取如下内容:

#include <boost/config.hpp>

class Foo{
public:
  Foo();
  Foo(Foo&);
#ifndef BOOST_NO_RVALUE_REFERENCES
  Foo(Foo&&);
#endif
};

请记住,函数的定义必须类似地包装。