Gam*_*per 6 c++ overriding final nullptr c++11
我想保持我的代码可以在遗留C++(使用"NULL"的C++代码)和新的C++ 11标准(使用"nullptr"的C++代码)上编译
我正在使用GCC,但是当我完成最重要的事情时,我还计划为VS重新编译整个代码库.
我是否应该期待GCC和VS都会这样做
#define NULL nullptr
Run Code Online (Sandbox Code Playgroud)
或者我自己会做得更好(当然使用不同的名称,其中MY_LIB将被我的库后缀替换)?
#ifndef nullptr
#define MY_LIB_NULL NULL
#else
#define MY_LIB_NULL nullptr
#endif
Run Code Online (Sandbox Code Playgroud)
我想要实现的是编译的代码,无论C++ 11的功能是否已经实现(并且因为我没有使用模板,所以它们很少).
例如,关键字"覆盖"和"最终"已经完成.
MY_LIB_OVERRIDE //macro, defines to "override" if c++11 is present.
MY_LIB_FINAL //macro, defines to "final" if c++11 is present.
Run Code Online (Sandbox Code Playgroud)
我问这个问题是因为我知道"nullptr"问题有点奇怪,所以也许只是我已经为覆盖和最终做了同样的事情,这是错误的.需要对此提出意见.任何帮助都很好.
您可能可以通过以下方式创建“false”my_nullptr类型:my_nullptr_t
const class my_nullptr_t
{
public:
/* Return 0 for any class pointer */
template<typename T>
operator T*() const
{
return 0;
}
/* Return 0 for any member pointer */
template<typename T, typename U>
operator T U::*() const
{
return 0;
}
/* Safe boolean conversion */
operator void*() const
{
return 0;
}
private:
/* Not allowed to get the address */
void operator&() const;
} my_nullptr = {};
Run Code Online (Sandbox Code Playgroud)
这适用于 C++03 和 C++11,并且无论实现哪种 C++11 功能,都应该始终是安全的。该解决方案实际上已经在本主题nullptr_t中讨论过,该主题提出了基于官方提案的版本。
| 归档时间: |
|
| 查看次数: |
1513 次 |
| 最近记录: |