如何定义一个函数来处理移动语义和复制语义?
How to define a function to work with move semantics and copy semantics?
假设我正在实现一个集合,我想向其中添加一个元素,例如。
template <typename T>
class MyCollection
{
void add(const T& element);
};
现在,由于添加元素通常意味着复制它,出于效率原因,拥有
以下版本的添加以及 void add(T&& element)
。现在的问题是,显然这两个函数的代码完全相同,唯一不同的是参数类型。目前我对C++的掌握有限,但我想知道是否有一种简单和惯用的方法可以将add
函数写一次而不重写两次?
事实上,这可以通过定义一个重载来解决:
void add(T element) {
where_it_is_actually_stored.insert(std::move(element));
}
接下来,根据您添加的是左值、由移动的左值生成的右值还是临时对象,编译器将解析适当的构造函数,以便复制或移动您的值参数。
我认为最通用的解决方案实际上是这样的。这是标准库提供的,所以我想这就是 "idiomatic".
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)...
}
};
假设我正在实现一个集合,我想向其中添加一个元素,例如。
template <typename T>
class MyCollection
{
void add(const T& element);
};
现在,由于添加元素通常意味着复制它,出于效率原因,拥有
以下版本的添加以及 void add(T&& element)
。现在的问题是,显然这两个函数的代码完全相同,唯一不同的是参数类型。目前我对C++的掌握有限,但我想知道是否有一种简单和惯用的方法可以将add
函数写一次而不重写两次?
事实上,这可以通过定义一个重载来解决:
void add(T element) {
where_it_is_actually_stored.insert(std::move(element));
}
接下来,根据您添加的是左值、由移动的左值生成的右值还是临时对象,编译器将解析适当的构造函数,以便复制或移动您的值参数。
我认为最通用的解决方案实际上是这样的。这是标准库提供的,所以我想这就是 "idiomatic".
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)...
}
};