我们都知道并喜欢它们的安全性和速度的智能指针,但是不得不调用这样的函数会让我感到困惑:
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)
还不够。但
答案 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
的更详细的版本,而我并没有真正发现它是一个真正的问题。