我有一个有两个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
的构造函数是显式的,所以它没有。
答案 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&&)
重载。