如何为 C++0x/11 和非 C++0x/11 制作标头
How to make a header for C++0x/11 and non C++0x/11?
我想为 C++0x/11
和非 C++0x/11 创建一个标头,以便它具有向后兼容性:
class Foo{
public:
Foo(){}
Foo(Foo&){}
#ifdef CXX0X //How to make it work here?
Foo(Foo&&){}
#endif
};
我建议不要检查__cplusplus
,因为 MSVC 和 GCC 都没有将其提高到201103L
,并且两者都支持右值引用几年。
您可以依靠特定于编译器的宏来执行您想要的操作:
- MSVC:
_MSC_VER >= 1600
- 海湾合作委员会:
__GXX_EXPERIMENTAL_CXX0X__
- 叮当:
__has_feature(cxx_rvalue_references)
但是,这样做有几个缺点。由于宏是特定于编译器的,并且目标是支持多个编译器,因此需要将它们包装在另一个宏中。此外,还有传言说__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
};
请记住,函数的定义必须以类似的方式包装。
我会看看提升配置库。它适用于库编写器,并且有很多宏来处理C++编译器版本和实现细节。即使您知道它是一个 C++11 编译器,您可能仍然需要了解一些一致性细节 - boost config 会告诉您。以下是文档的链接:
http://www.boost.org/doc/libs/1_55_0/libs/config/doc/html/index.html
相关文章:
- 如何将模板和非模板函数放在一个文件中
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 一个模板方法,用于同时接受常量和非常量参数
- C++ 常量正确性/缺少支持常量和非常量实例的类的常量构造函数
- C++,如何使用常量对象和非常量对象进行比较?
- 返回引用实例和非引用实例(return mystr & vs mystr)之间的区别是什么?
- 避免易失性和非易失性成员函数的代码重复
- 修改和非修改 putback() 之间的区别
- GCC 和非命名空间范围内的显式专用化
- 常量和非常量 getter 具有相同的名称
- ADL 和非类型模板参数
- 处理一般情况混合类型和非类型的可变参数模板
- C++模板和非模板函数之间的重载解析
- 如何在单个模板调用中传递const_iterator和非const迭代器
- 获取模板以匹配常量 T* 和非常量 T* 的不同序列
- 是否可以有一个模板函数,可以将向量和非向量类型都作为参数
- 如何组合切片、模板和非派生类
- 常量和非常量类型的相同模板专用化
- 使用指针向量和非指针向量有什么区别
- 如何为 C++0x/11 和非 C++0x/11 制作标头