【问题标题】:How to make a header for C++0x/11 and non C++0x/11? [duplicate]如何为 C++0x/11 和非 C++0x/11 制作标头? [复制]
【发布时间】:2014-02-21 00:37:52
【问题描述】:

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

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

【问题讨论】:

  • @chris 这如何区分两个 C++ 版本?
  • @JohnKugelman __cplusplus 具有您可以测试的值。请参阅我评论中链接的问题。
  • @JohnKugelman,这是一个公平的开始。只需一次 Google 搜索即可获得答案。
  • @chris 那么你应该发布那个答案。并将其作为实际答案进行,以便人们对其进行投票。请不要在 cmets 部分回答问题。使用 cmets 询问更多信息或提出改进建议。
  • 今后您还想了解 C++14 的一致性吗?

标签: c++ c++11


【解决方案1】:

我建议不要检查 __cplusplus,因为 MSVC 或 GCC 都没有将它提升到 201103L,而且它们都支持右值引用已有几年了。

您可以依靠特定于编译器的宏来做您想做的事情:

不过,这样做有几个缺点。由于宏是特定于编译器的,并且目标是支持多个编译器,因此需要将它们包装在另一个宏中。此外,还有人说__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
};

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

【讨论】:

  • 还有feature test recommendation。 Clang 现在实现了它,希望其他编译器也能采用它。然后你可以使用#ifdef __cpp_rvalue_references 或者你可以查看具体的版本号。
  • @bames53,提供的实现支持它,我期待一种更标准的功能测试方法。然而,我并不期待它会鼓励人们写作的宏汤。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-08-31
    • 1970-01-01
    • 2013-10-31
    • 2013-06-25
    • 1970-01-01
    • 2013-06-07
    • 2010-09-18
    • 2010-09-25
    相关资源
    最近更新 更多