有没有办法使用unique_ptr进行实例化,而不是详细?

时间:2014-02-18 17:31:56

标签: c++ c++11 unique-ptr

我有一个有两个std::unique_ptr成员的班级。我想通过构造函数设置这些成员。

目前我正在这样做:

std::unique_ptr<Assignment> assignment{new Assignment{
       std::unique_ptr<Variable>{new Variable{"a"}},
       std::unique_ptr<Expression>{new Variable{"b"}}
}};

使用常规指针,我会这样做:

auto assignment = new Assignment{new Variable{"a"}, new Variable{"b"}};
delete assignment;

我能否以某种方式使智能指针版本更简洁?我希望这样的事可能有用。

std::unique_ptr<Assignment> assignment{new Variable{"a"},{new Variable{"b"}};

但是,unique_ptr的构造函数是显式的,所以它没有。

2 个答案:

答案 0 :(得分:2)

是一个完美的转发构造函数吗?

// If you aren't using make_unique, you're doing it wrong.
template <typename T, typename...Args>
inline std::unique_ptr<T> make_unique(Args&&...args) {
    return std::unique_ptr<T>{new T(std::forward<Args>(args)...)};
}

struct Variable {
    std::string name_;

    Variable(std::string name) : name_{std::move(name)} {}
};

struct Assignment {
    std::unique_ptr<Variable> a_, b_;

    template <typename T, typename U>
    Assignment(T&& a, U&& b) :
      a_{make_unique<Variable>(std::forward<T>(a))},
      b_{make_unique<Variable>(std::forward<U>(b))} {}
};

auto assignment = make_unique<Assignment>("a", "b");

简化语法,IMO。

答案 1 :(得分:0)

最简单的解决方案可能是

std::unique_ptr<Assignment> assignment {
   new Assignment{Variable{"a"}, Variable{"b"}}};

当然,这需要适当的Assignment(Variable&&, Variable&&)重载。