带有boost :: shared_ptr的NULL指针?

56 c++ null boost pointers shared-ptr

什么相当于以下内容:

std::vector<Foo*> vec;
vec.push_back(NULL);
Run Code Online (Sandbox Code Playgroud)

什么时候处理boost::shared_ptr?它是以下代码吗?

std::vector< boost::shared_ptr<Foo> > vec;
vec.push_back(boost::shared_ptr<Foo>());
Run Code Online (Sandbox Code Playgroud)

注意:我可能会推回很多这样的对象.我应该在nullPtr某处声明一个全局静态对象吗?这样只需要构建其中一个:

boost::shared_ptr<Foo> nullPtr;
Run Code Online (Sandbox Code Playgroud)

j_r*_*ker 52

你的建议(调用shared_ptr<T>没有参数的构造函数)是正确的.(使用值0调用构造函数是等效的.)我认为这不会比vec.push_back()使用预先存在的调用慢shared_ptr<T>,因为在两种情况下都需要构造(直接构造或复制构造).

但是如果你想要"更好"的语法,你可以尝试以下代码:

class {
public:
    template<typename T>
    operator shared_ptr<T>() { return shared_ptr<T>(); }
} nullPtr;
Run Code Online (Sandbox Code Playgroud)

这声明了一个全局对象nullPtr,它启用以下自然语法:

shared_ptr<int> pi(new int(42));
shared_ptr<SomeArbitraryType> psat(new SomeArbitraryType("foonly"));

...

pi = nullPtr;
psat = nullPtr;
Run Code Online (Sandbox Code Playgroud)

请注意,如果您在多个翻译单元(源文件)中使用它,则需要为该类指定名称(例如_shared_null_ptr_type),将nullPtr对象的定义移动到单独的.cpp文件,并extern在头文件中添加声明该类已定义.


Lar*_*itz 17

嗯,这是合法的:

shared_ptr<Foo> foo;  /* don't assign */
Run Code Online (Sandbox Code Playgroud)

在这种状态下,它并没有指向任何东西.你甚至可以测试这个属性:

if (foo) {
    // it points to something
} else {
    // no it doesn't
}
Run Code Online (Sandbox Code Playgroud)

那么为什么不这样做:

std::vector < shared_ptr<Foo> > vec;
vec.push_back (shared_ptr<Foo>);   // push an unassigned one
Run Code Online (Sandbox Code Playgroud)


bdo*_*lan 9

在C++ 0x中,您只需转换nullptrstd::shared_ptr:

std::vector< boost::shared_ptr<Foo> > vec;
vec.push_back(nullptr);
Run Code Online (Sandbox Code Playgroud)


Chr*_*lan 0

是的,声明一个全局静态空指针。