I have 2 classes: A
and B
. I need to pass instances of them to a function that will push them into a vector. I want to have good efficiency in my program, so I try to use move semantics. So in that function I need const A&
and A&&
type for A
as well as for B
.
It forces me to create 2^N
number of functions where N
is the number of parameters to that function. In my case N
is 2 and this means that I need to create 4 almost identical copies of the function.
Code:
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));
}
The code is simplified. In my real code, the Function
is bigger.
So, I want to know if there is another, better way of doing this?
Hope for your help!
CodePudding user response:
You can create a template function and use std::forward
to pass on the value with the correct reference type:
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));
}