Nó có thể là hiệu quả hơn để có một helper make_foo
:
Foo make_foo() { return Foo(std::make_shared<Stuff>()); }
Bây giờ bạn có thể nói auto f = make_foo();
. Hoặc ít nhất hãy tự mình sử dụng số điện thoại make_shared
, vì kết quả shared_ptr
có thể hiệu quả hơn so với kết quả được tạo từ biểu thức new
. Và nếu Stuff
thực sự mất đối số nhà xây dựng, một nhà xây dựng phụ trợ riêng có thể phù hợp:
struct Foo
{
template <typename ...Args>
static Foo make(Args &&... args)
{
return Foo(direct_construct(), std::forward<Args>(args)...);
};
private:
struct direct_construct{};
template <typeaname ...Args>
Foo(direct_construct, Args &&... args)
: m_myStuff(std::make_shared<Stuff>(std::forward<Args>(args)...)) // #1
{ }
};
Bạn có thể quấn Foo::make
vào trên make_foo
, hoặc sử dụng nó trực tiếp:
auto f = Foo::make(true, 'x', Blue);
Điều đó nói rằng, trừ khi bạn Thực sự là chia sẻ quyền sở hữu, một âm thanh std::unique_ptr<Stuff>
giống như cách tiếp cận thích hợp hơn: Cả hai khái niệm đơn giản hơn nhiều và cũng hiệu quả hơn một chút. Trong trường hợp đó, bạn sẽ nói m_myStuff(new Stuff(std::forward<Args>(args)...))
trong dòng được đánh dấu #1
.
Nguồn
2012-08-17 08:47:34
@sellibitze typo – Baz
Không thực sự, 'Foo' không * nhận * quyền sở hữu. Điểm của 'shared_ptr' là * chia sẻ * quyền sở hữu. – juanchopanza
Hoặc thích 'std :: shared_ptr foosStuff (new Stuff());' –
stefaanv