空指针与boost :: shared_ptr?
什么是相当于以下内容:
std::vector<Foo*> vec; vec.push_back(NULL);  当处理boost::shared_ptr ? 它是下面的代码? 
 std::vector< boost::shared_ptr<Foo> > vec; vec.push_back(boost::shared_ptr<Foo>()); 
 注意:我可能推回很多这样的对象。 我应该在哪里声明一个全局静态的nullPtr对象? 那样只有其中一个必须被修build: 
 boost::shared_ptr<Foo> nullPtr; 
	
 你的build议(不带参数地调用shared_ptr<T>构造函数)是正确的。  (调用值为0的构造函数是等价的。)我不认为这会vec.push_back()存在的shared_ptr<T>调用vec.push_back()慢,因为在这两种情况下都需要构造build设或复制build设)。 
但是,如果你想“更好”的语法,你可以尝试下面的代码:
 class { public: template<typename T> operator shared_ptr<T>() { return shared_ptr<T>(); } } nullPtr; 
 这声明了一个单一的全局对象nullPtr ,它启用以下自然语法: 
 shared_ptr<int> pi(new int(42)); shared_ptr<SomeArbitraryType> psat(new SomeArbitraryType("foonly")); ... pi = nullPtr; psat = nullPtr; 
 请注意,如果您在多个翻译单元(源文件)中使用它,则需要为该类提供一个名称(例如_shared_null_ptr_type ),将nullPtr对象的定义移动到单独的.cpp文件中,并将extern声明添加到头文件的类定义。 
那么,这是合法的:
 shared_ptr<Foo> foo; /* don't assign */ 
而在这种状态下,它并没有指向任何东西。 你甚至可以testing这个属性:
 if (foo) { // it points to something } else { // no it doesn't } 
那么为什么不这样做:
 std::vector < shared_ptr<Foo> > vec; vec.push_back (shared_ptr<Foo>); // push an unassigned one 
 在C ++ 0x中,您可以简单地从nullptr转换为std::shared_ptr : 
 std::vector< boost::shared_ptr<Foo> > vec; vec.push_back(nullptr); 
 你可以为shared_ptr<Foo>声明一个全局的nullPtr 。 但是如果你污染了全局的命名空间,你会为shared_ptr<Bar>调用全局的nullPtr ? 
通常,我将空ptr声明为指针类中的静态。
 #include <boost\shared_ptr.hpp> class Foo; // forward decl typedef boost::shared_ptr<Foo> FooPtr; class Foo { public: static FooPtr Null; } ... // define static in cpp file FooPtr Foo::Null; ... // use Foo Null vec.push_back(Foo::Null); 
这样每个类都有一个静态的Null。
这是我认为是更简单,工作得很好的东西
  (记住typedef是你的朋友): 
 #include <cstdlib> #include <vector> #include <iostream> #include <boost/shared_ptr.hpp> typedef boost::shared_ptr< std::vector<char> > CharVecHandle; inline CharVecHandle newCharVec(std::vector<char>::size_type size) { return CharVecHandle(new std::vector<char>(size)); } inline CharVecHandle newCharVec(void) { return CharVecHandle(); } int main ( void ) { CharVecHandle cvh = newCharVec(); if (cvh == NULL) std::cout << "It's NULL" << std::endl; else std::cout << "It's not NULL" << std::endl; std::vector< CharVecHandle > cvh_vec; cvh_vec.push_back(newCharVec(64)); cvh_vec.push_back(newCharVec()); // or call the NULL constructor directly cvh_vec.push_back(CharVecHandle()); return EXIT_SUCCESS; } 
是的,声明一个全局静态空指针。