函数副本太多,无法在 C++ 中使用 std::move

Too many copies of the function to use std::move in C++

我有 2 个 类:AB。我需要将它们的实例传递给一个将它们推入向量的函数。我想在我的程序中有很好的效率,所以我尝试使用移动语义。因此,在该函数中,我需要 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));
}