簡體   English   中英

是否有std :: move(std :: unique_ptr())組合的標准縮寫?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM