[英]How to define a function to work with move semantics and copy semantics?
假設我正在實現一個集合,並且我想向其中添加一個元素,例如。
template <typename T>
class MyCollection
{
void add(const T& element);
};
現在,由於添加元素通常意味着復制它,出於效率原因,具有以下版本的 add 以及void add(T&& element)
是有意義的。 現在的問題是,顯然這兩個函數的代碼完全相同,只是參數類型不同。 我的 C++ 命令目前是有限的,但我想知道是否有一種簡單而慣用的方法來編寫一次add
function 而無需重寫兩次?
事實上,這是通過定義一個重載來解決的:
void add(T element) {
where_it_is_actually_stored.insert(std::move(element));
}
接下來,根據您是添加左值、由移動的左值生成的右值還是臨時 object,編譯器將解析適當的構造函數,以便復制或移動您的值參數。
我認為最通用的解決方案實際上就是這個。 這是標准庫提供的,所以我想這使它“慣用”。
template<typename T>
struct my_collection {
template<typename... Args>
void emplace(Args&&... args) {
// construct the T object directly in its place out of std::forward<Args>(args)...
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.