是否有std :: move(std :: unique_ptr())组合的标准缩写?

时间:2013-09-08 20:36:15

标签: c++ c++11

我终于开始将我的代码库迁移到C ++ 11,这导致了更短更好的代码。

但是我发现当我用新指针调用函数时,它比以前长了很多:

void addCallback(Callback*);  // Takes ownership of callback.
// ...
addCallback(new Callback);    // Clear.

变为

void addCallback(std::unique_ptr<Callback>);  // No comment needed now!
// ...
addCallback(std::move(std::unique_ptr<Callback>(new Callback)));  // bleh.

建议的make_unique()模板功能只能在一定程度上改善这一点。

经过一些实验,我刚刚为此写了一个辅助模板函数:

template <typename T>
auto move_ptr(T *t) -> decltype(std::move(std::unique_ptr<T>(t))) {
  return std::move(std::unique_ptr<T>(t));
}
// ..
addCallback(move_ptr(new Callback));  // Not bad!
它似乎工作正常 - 但我肯定会重新发明轮子? (如果我不是 - 我的move_ptr或我最终称之为的任何陷阱或可能的错误?)

1 个答案:

答案 0 :(得分:16)

你的意思是,你想写一些比这行简单的东西吗?

addCallback(std::move(std::unique_ptr<Callback>(new Callback)));  // bleh.

嗯,std::move()是多余的,因为你可以直接将临时值与rvalue引用绑定:

addCallback(std::unique_ptr<Callback>(new Callback));

可悲的是,没有std::make_unique()但是make_unique()很容易写:

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

......产生

addCallback(make_unique<Callback>());