传递智能指针的简洁替代方案

时间:2014-04-25 11:23:05

标签: c++ c++11 coding-style smart-pointers

我们都知道并喜欢它们的安全性和速度的智能指针,但是不得不调用这样的函数会让我感到困惑:

void TreeNode::addChild(unique_ptr<TreeNode> newChild){
    children_.push_back(std::move(newChild));
}
//This has to be called like so:

node.addChild(unique_ptr<TreeNode>(new TreeNode(10));

我发现这是不必要的冗长和冗长。这真的是最好的做事方式吗?我不能只传递原始指针并在unique_ptr内创建addChild吗?什么是替代品,这种冗长有什么好处?

编辑:我想补充说TreeNode可以派生出来,所以仅仅实施addChild(int arg)还不够。但

3 个答案:

答案 0 :(得分:4)

在C ++ 14中,您可以使用std::make_unique函数。

在C ++ 11中自己实现它,例如:

#include <memory>

struct X { X(int, int); };

void foo(std::unique_ptr<X>);

template<class T, class... Args>
inline std::unique_ptr<T> make_unique(Args&&... args) {
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

int main() {
    foo(make_unique<X>(1, 2));
}

答案 1 :(得分:3)

  • 您可以执行以下操作:

    template<typename...Ts>
    void TreeNode::emplaceChild(Ts&&...args){
        children_.emplace_back(make_unique<TreeNode>(std::forward<Ts>(args)...));
    }
    

    然后:

    node.emplaceChild(10);
    
  • 要指定要添加的子项类型,您可以使用替换:

    template<typename T, typename...Ts>
    void TreeNode::emplaceChild(Ts&&...args) {
        children_.emplace_back(make_unique<T>(std::forward<Ts>(args)...));
    }
    

    然后:

    node.emplaceChild<TreeNode>(10);
    

答案 2 :(得分:0)

您可以使用typedef(在C ++ 11中由using替换):

using TreeNodeUP = std::unique_ptr<TreeNode>;

简化一些代码:

void TreeNode::addChild(TreeNodeUP newChild);

另一种方法是,如果您可以控制类型TreeNode,则将typedef放入类中,并将其称为UP或类似的短文并使用

void TreeNode::addChild(TreeNode::UP newChild);

请注意,我个人不喜欢那些typedef,我更喜欢拼写出std::unique_ptr的更详细的版本,而我并没有真正发现它是一个真正的问题。