Правда, у меня нет компилятора C ++ 0x, который обрабатывает шаблоны с переменными значениями, поэтому я не могу его протестировать. Но это может помочь.
template<typename T>
struct wrapped
{
wrapped(T &&x)
: m_x(std::forward<T>(x))
{}
typedef T type;
T m_x;
};
template<typename... Types>
wrapped<std::tuple<Types&&...>> zip(wrapped<Types>&&... x)
{
return wrapped<std::tuple<Types&&...>>(std::tuple<Types&&...>(std::forward<Types>(x.m_x)...));
}
Я не совсем уверен, законно ли называть zip
так:
zip(wrapped<T1>(value1), wrapped<T2>(value2));
Возможно, вам придется явно квалифицировать вызов:
zip<T1, T2>(wrapped<T1>(value1), wrapped<T2>(value2));