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)
在C++ 0x中,您只需转换nullptr为std::shared_ptr:
std::vector< boost::shared_ptr<Foo> > vec;
vec.push_back(nullptr);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
60247 次 |
| 最近记录: |