0

我有这样的情况

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?

(我存储ptrconst Foo因为我会复制Bar和更改index_,但datainptr_会是一样的 - 你可以假设这Foo是一些容器的大问题)

4

1 回答 1

2

只需滚动您自己的版本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供自己使用。

于 2015-01-26T22:55:40.267 回答