"Backporting" nullptr 到 C++-pre-C++0x 程序
"Backporting" nullptr to C++-pre-C++0x programs
或多或少是标题所暗示的。虽然我还没有使用C++0x,但我想为它发生时做好准备,我还想减少为了使用它的一些功能而必须重写的代码量。这样我就可以一次性获得前后兼容性。
我发现的最有趣的一个是nullptr
,我最近经常使用它。
在检查了"官方变通方法"和Meyer的建议后,我决定在我的C++和未来的C++0x程序中都使用它。第二部分很简单——作为一个关键字,nullptr
将得到简单的支持。但第一部分让我有些不舒服。
Meyers提案的功能如下:
class nullptr_t { // ← this is my issue
// definition of nullptr_t
} nullptr = { };
该建议的问题在于,它按照C++0x的要求将要声明为std::nullptr_t
的类型声明。这意味着要想让变通方法"感觉是本地的",必须通过重新打开std::
命名空间来添加类型我知道在C++程序中这样做是非法的(与添加专业化不同,这显然是一个警告)。
我想在C++程序中以舒适的AND合法方式使用nullptr
。我想到的一个选项是在另一个命名空间中声明类型,然后使用using
:将其引入
namespace mylibrary {
class nullptr_t {
....
} nullptr = { };
// end namespace
}
// These would have to go in the header file.
using mylibrary::nullptr;
using mylibrary::nullptr_t; // apparently this is necessary as well?
这是让它工作的正确方法吗?它将强制执行using
指令,这也强制执行特定顺序的#include
指令。我认为C++0x之前的代码都不会请求带有名称空间的类型nullptr_t
(例如,作为函数参数类型),这是对的吗?如果是这样做的话,它真的会"感觉本土"吗?
作为一个附录,为了更好的兼容性和编码,尝试将一些漂亮的C++0x东西移植到C++是一件受欢迎还是不受欢迎的事情?与此同时,我已经将这个解决方案和我正在开发的其他解决方案集成到一个即将发布的软件中。
除非你能想出一个需要声明另一个类型为nullptr_t
的对象的原因(我不能),否则我会隐藏该类型,并将nullptr
放在全局命名空间中,以尽可能接近地模仿一个关键字:
namespace mylibrary
{
class nullptr_t
{
....
};
}
mylibrary::nullptr_t nullptr = { };
不允许向namespace std
添加内容的主要原因是为了避免将已经存在的内容搞砸。否则这很容易做到。我在过去发现,对于使用内置类型(如std::vector<int>
)实例化的容器,输出运算符有多个定义。但是,这个名称空间中没有定义nullptr_t
,添加typedef
应该是无害的。也就是说,我将在与namespace std
不同的命名空间中定义nullptr_t
,然后将nullptr_t
的typedef
添加到namespace std
。无论如何,变量nullptr
都需要在全局范围内声明,因为它在C++2011中是非限定使用的。
是否需要类型std::nullptr_t
取决于您是否有兴趣使用此类型添加签名。例如,可以将std::shared_ptr<T>
与nullptr
进行比较。为此,有必要添加适当的重载,其中提到类型std::nullptr_t
(或为该类型使用其他名称)。
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 无法加载dll libglorycolx2010.dll.该应用程序未能启动,因为其并排配置不正确.Hresult:0x
- 在DLL中提供的ZeroMQ上下文单例在程序退出时崩溃(VS2010 win7 x64 zmq 4.0x)
- 按类型获取元组元素(pre C++0x)
- "Backporting" nullptr 到 C++-pre-C++0x 程序
- 基于功能区的MFC应用程序在Windows pre-Vista/7上工作
- 如何使用pre-c++0x(VS2008)实现"Variadic Template"?
- 捕获程序中的C++0x标志