【问题标题】:Constructor taking shared_ptr构造函数采用 shared_ptr
【发布时间】:2015-01-26 22:45:43
【问题描述】:

我有这样的情况

struct Foo
{
    Foo(int x, int y) : x(x), y(y)
    {
    }
    int x, y;
};

class Bar
{
public:
    typedef std::shared_ptr<const Foo>  ConstFooPtr;
    typedef std::shared_ptr<Foo>        FooPtr;

    Bar(int index = 0, FooPtr ptr = FooPtr()) : index_(index), ptr_(ptr)
    {
    }

private:
    ConstFooPtr ptr_;
    int index_;
};

我想制作 Bar,我想到了 2 个方法

Bar::FooPtr ptr(new Foo(1, 2)); //1

auto ptr2 = std::make_shared<Bar::FooPtr::element_type>(42, 13); //2

auto bar = Bar(0, ptr);

第一个很笼统,因为如果我要更改FooPtr 的类型,也许我不必更改此代码。但它使用new 我猜这很糟糕。

Second 不使用new,但它假定它是shared_ptr,这也不通用。

有什么方法可以让它工作并通用吗?或者也许我不应该在构造函数中使用一些 ptrs?

(我将ptr 存储到const Foo,因为我将复制Bar 并更改index_,但ptr_ 中的data 将是相同的 - 您可以假设Foo 是什么有一些容器很大)

【问题讨论】:

    标签: c++ c++11 typedef shared-ptr make-shared


    【解决方案1】:

    只需滚动您自己的make_shared 版本并将其作为Bar 的静态成员:

    template<typename... Args>
    static FooPtr make_shared_foo(Args... args)
    {
        return ::std::make_shared<Foo>(::std::forward<Args>(args)...);
    }
    

    这样你可以让你的指针像这样:

    auto ptr3 = Bar::make_shared_foo(3,14159);
    

    当然,没有什么能阻止您将其升级为终极版本:

    Bar(int index = 0) : index_(index), ptr_(FooPtr())
    { }
    
    template<typename... Args>
    Bar(int index, Args... args)
        : index_(index)
        , ptr_(new Foo(::std::forward<Args>(args)...))
    { }
    

    它只允许您将参数传递给构造函数到 Bar,然后将它们转发以创建指向 Foo 的指针以供自己使用。

    【讨论】:

      猜你喜欢
      • 2021-08-28
      • 1970-01-01
      • 2012-08-13
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      相关资源
      最近更新 更多