I was just writing a generic object factory and using the boost preprocessor meta-library to make a variadic template (using 2010 and it doesn't support them). My function uses rval references and std::forward
to do perfect forwarding and it got me thinking...when C++0X comes out and I had a standard compiler I would do this with real variadic templates. How though, would I call std::forward
on the arguments?
template <typename ...Params>
void f(Params... params) // how do I say these are rvalue reference?
{
y(std::forward(...params)); //? - I doubt this would work.
}
Only way I can think of would require manual unpacking of ...params and I'm not quite there yet either. Is there a quicker syntax that would work?
You would do:
template <typename ...Params>
void f(Params&&... params)
{
y(std::forward<Params>(params)...);
}
The ...
is a pack expansion and pretty much says "take what's on the left, and for each template parameter, unpack it accordingly."
For example, f<int, float&>
instantiated looks like:
void f<int, float&>(int&& params_0, float& params_1)
{
y(std::forward<int>(params_0), std::forward<float&>(params_1));
}