小编joh*_*yrd的帖子

C++ 11 make_shared实例化

为长期问题道歉,但有些背景是必要的.我有一些代码似乎是我正在进行的项目的有用模式:

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.

在类中封装智能指针类型提供了几个优点:

  1. 它允许您控制指针类型的可复制性和可移动性.
  2. 它隐藏了调用者的shared_ptr细节,因此可以将非平凡的对象构造(例如抛出异常的构造)置于Instance()调用中.
  3. 在使用多个智能指针实现的项目时,可以更改基础智能指针类型.您可以切换到unique_ptr甚至是特定类的原始指针,并且调用代码将保持不变.
  4. 它集中了关于(智能)指针构造和别名的细节,这些关于最了解如何操作的类.
  5. 它允许您决定哪些类可以使用智能指针以及哪些类必须在堆栈上构建.PointerType字段的存在向调用者提供了关于可以为类创建哪些类型的指针的提示.如果没有为类定义PointerType,这将表明不能创建指向该类的指针; 因此,必须在堆栈上创建特定的类,RAII样式.

但是,我没有看到将这段代码应用于项目中的所有类的明显方法,而无需直接键入必需的typedef和静态PointerType Instance()函数.我怀疑应该有一些一致的,C++ 11标准,跨平台的方式来实现这一点与基于策略的模板,但一些实验并没有显示出一种明显的方式将这个简单地应用于一堆类中的一个在所有现代C++编译器上完全编译的方式.

你能想到一种优雅的方式将这些概念添加到一堆类中,而不需要大量的剪切和粘贴吗?理想的解决方案是概念性地限制可以为哪些类型的类创建哪些类型的指针(一个类使用shared_ptr而另一个类使用原始指针),并且它还将通过其自己的首选方法处理任何受支持类型的实例化.这种解决方案甚至可以通过在编译时适当地在非标准和标准智能和哑指针类型之间失败来处理和/或限制强制.

c++ templates smart-pointers shared-ptr c++11

7
推荐指数
2
解决办法
936
查看次数

标签 统计

c++ ×1

c++11 ×1

shared-ptr ×1

smart-pointers ×1

templates ×1