函数副本太多,无法在 C++ 中使用 std::move
Too many copies of the function to use std::move in C++
我有 2 个 类:A
和 B
。我需要将它们的实例传递给一个将它们推入向量的函数。我想在我的程序中有很好的效率,所以我尝试使用移动语义。因此,在该函数中,我需要 const A&
和 A&&
键入 A
以及 B
。
它迫使我创建 2^N
个函数,其中 N
是该函数的参数数量。在我的例子中,N
是 2,这意味着我需要创建 4 个几乎相同的函数副本。
代码:
struct A {
std::vector<int> v;
};
struct B {
std::vector<int> v;
};
static std::vector<std::pair<A, B>> elements;
void Function(const A &a, const B &b) {
elements.emplace_back(a, b);
}
void Function(A &&a, const B &b) {
elements.emplace_back(std::move(a), b);
}
void Function(const A &a, B &&b) {
elements.emplace_back(a, std::move(b));
}
void Function(A &&a, B &&b) {
elements.emplace_back(std::move(a), std::move(b));
}
代码已简化。在我的真实代码中,Function
更大。
所以,我想知道是否有另一种更好的方法来做到这一点?
希望得到您的帮助!
您可以创建一个模板函数并使用 std::forward
传递具有正确引用类型的值:
template<class T, class U>
void Function(T&& a, U&& b) // note: universal references are used here, not rvalue references
{
elements.emplace_back(std::forward<T>(a), std::forward<U>(b));
}
我有 2 个 类:A
和 B
。我需要将它们的实例传递给一个将它们推入向量的函数。我想在我的程序中有很好的效率,所以我尝试使用移动语义。因此,在该函数中,我需要 const A&
和 A&&
键入 A
以及 B
。
它迫使我创建 2^N
个函数,其中 N
是该函数的参数数量。在我的例子中,N
是 2,这意味着我需要创建 4 个几乎相同的函数副本。
代码:
struct A {
std::vector<int> v;
};
struct B {
std::vector<int> v;
};
static std::vector<std::pair<A, B>> elements;
void Function(const A &a, const B &b) {
elements.emplace_back(a, b);
}
void Function(A &&a, const B &b) {
elements.emplace_back(std::move(a), b);
}
void Function(const A &a, B &&b) {
elements.emplace_back(a, std::move(b));
}
void Function(A &&a, B &&b) {
elements.emplace_back(std::move(a), std::move(b));
}
代码已简化。在我的真实代码中,Function
更大。
所以,我想知道是否有另一种更好的方法来做到这一点?
希望得到您的帮助!
您可以创建一个模板函数并使用 std::forward
传递具有正确引用类型的值:
template<class T, class U>
void Function(T&& a, U&& b) // note: universal references are used here, not rvalue references
{
elements.emplace_back(std::forward<T>(a), std::forward<U>(b));
}