什么相当于以下内容:
std::vectorvec; vec.push_back(NULL);
什么时候处理boost::shared_ptr
?它是以下代码吗?
std::vector< boost::shared_ptr> vec; vec.push_back(boost::shared_ptr ());
注意:我可能会推回很多这样的对象.我应该在nullPtr
某处声明一个全局静态对象吗?这样只需要构建其中一个:
boost::shared_ptrnullPtr;
j_random_hac.. 52
你的建议(调用shared_ptr
没有参数的构造函数)是正确的.(使用值0调用构造函数是等效的.)我认为这不会比vec.push_back()
使用预先存在的调用慢shared_ptr
,因为在两种情况下都需要构造(直接构造或复制构造).
但是如果你想要"更好"的语法,你可以尝试以下代码:
class { public: templateoperator shared_ptr () { return shared_ptr (); } } nullPtr;
这声明了一个全局对象nullPtr
,它启用以下自然语法:
shared_ptrpi(new int(42)); shared_ptr psat(new SomeArbitraryType("foonly")); ... pi = nullPtr; psat = nullPtr;
请注意,如果您在多个翻译单元(源文件)中使用它,则需要为该类指定名称(例如_shared_null_ptr_type
),将nullPtr
对象的定义移动到单独的.cpp文件,并extern
在头文件中添加声明该类已定义.
你的建议(调用shared_ptr
没有参数的构造函数)是正确的.(使用值0调用构造函数是等效的.)我认为这不会比vec.push_back()
使用预先存在的调用慢shared_ptr
,因为在两种情况下都需要构造(直接构造或复制构造).
但是如果你想要"更好"的语法,你可以尝试以下代码:
class { public: templateoperator shared_ptr () { return shared_ptr (); } } nullPtr;
这声明了一个全局对象nullPtr
,它启用以下自然语法:
shared_ptrpi(new int(42)); shared_ptr psat(new SomeArbitraryType("foonly")); ... pi = nullPtr; psat = nullPtr;
请注意,如果您在多个翻译单元(源文件)中使用它,则需要为该类指定名称(例如_shared_null_ptr_type
),将nullPtr
对象的定义移动到单独的.cpp文件,并extern
在头文件中添加声明该类已定义.
嗯,这是合法的:
shared_ptrfoo; /* don't assign */
在这种状态下,它并没有指向任何东西.你甚至可以测试这个属性:
if (foo) { // it points to something } else { // no it doesn't }
那么为什么不这样做:
std::vector < shared_ptr> vec; vec.push_back (shared_ptr ); // push an unassigned one
在C++ 0x中,您只需转换nullptr
为std::shared_ptr
:
std::vector< boost::shared_ptr> vec; vec.push_back(nullptr);