2014-02-18 53 views
0

我有两个std::unique_ptr成员的课。我想通过构造函数设置这些成员。有没有办法用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的构造函数是显式的,所以它没有。

+4

你可以提供你自己的['std :: make_unique']实现(http://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique)来使一些事情变得容易一些。 –

+3

如果你正在寻找一种实现'make_unique()'的方法,我会建议:http://stackoverflow.com/questions/7038357/make-unique-and-perfect-forwarding。另外,请注意,在第二个和第三个示例中,如果构建第二个“新变量”失败,则会泄漏内存。 (这是std :: make_unique和std :: make_shared全部的一部分)。 –

+0

@sharth:第一个例子中的情况也是如此。我不确定,但我相信编译器可以交错创建两个'unique_ptr'参数,首先执行两个'new',然后构造'unique_ptr',可能会泄漏内存。您需要交错函数调用('make_unique')以确保没有内存泄漏。 –

回答

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简化了语法。

0

的最简单的解决办法可能是

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

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

相关问题