为长期问题道歉,但有些背景是必要的.我有一些代码似乎是我正在进行的项目的有用模式:
class Foo
{
public:
Foo( int bar = 1 );
~Foo();
typedef std::shared_ptr< Foo > pointer_type;
static pointer_type make( int bar = 1 )
{
return std::make_shared< Foo >( bar );
}
...
}
Run Code Online (Sandbox Code Playgroud)
如您所见,它提供了一种将任何类构造为PointerType的简单方法,该类将shared_ptr封装到该类型:
auto oneFoo = Foo::make( 2 );
Run Code Online (Sandbox Code Playgroud)
因此,您可以获得shared_ptr的优势,而无需在整个代码库中引用make_shared和shared_ptr.
在类中封装智能指针类型提供了几个优点:
但是,我没有看到将这段代码应用于项目中的所有类的明显方法,而无需直接键入必需的typedef和静态PointerType Instance()函数.我怀疑应该有一些一致的,C++ 11标准,跨平台的方式来实现这一点与基于策略的模板,但一些实验并没有显示出一种明显的方式将这个简单地应用于一堆类中的一个在所有现代C++编译器上完全编译的方式.
你能想到一种优雅的方式将这些概念添加到一堆类中,而不需要大量的剪切和粘贴吗?理想的解决方案是概念性地限制可以为哪些类型的类创建哪些类型的指针(一个类使用shared_ptr而另一个类使用原始指针),并且它还将通过其自己的首选方法处理任何受支持类型的实例化.这种解决方案甚至可以通过在编译时适当地在非标准和标准智能和哑指针类型之间失败来处理和/或限制强制.