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