5

我终于开始将我的代码库迁移到 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或我最终称之为的任何陷阱或可能的错误?)

4

1 回答 1

16

You mean, you want to write something simpler than this line?

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

Well, the std::move() is superfluous as you can bind temporaries to rvalue references directly:

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

Sadly, there is no std::make_unique() but a make_unique() is easy enough to write:

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

... which yields

addCallback(make_unique<Callback>());
于 2013-09-08T20:41:44.840 回答