gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:12 25 4
gpt4 key购买 nike

我终于要将我的代码库迁移到 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 或我最终调用它的任何东西是否有任何陷阱或可能的错误?)

最佳答案

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

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

好吧,std::move() 是多余的,因为您可以直接将临时变量绑定(bind)到右值引用:

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>());

关于c++ - std::move(std::unique_ptr()) 组合是否有标准缩写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18688420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com