[英]Is there a standard abbreviation for the std::move(std::unique_ptr()) combination?
我終於開始將我的代碼庫遷移到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()
是多余的,因為你可以直接將臨時值與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>());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.