Si desea utilizar std :: tuple y tiene un compilador de C++ que admita plantillas variadic, intente con el código siguiente (probado con g ++ 4.5). Esta debería ser la respuesta a tu pregunta.
#include <tuple>
// ------------- UTILITY---------------
template<int...> struct index_tuple{};
template<int I, typename IndexTuple, typename... Types>
struct make_indexes_impl;
template<int I, int... Indexes, typename T, typename ... Types>
struct make_indexes_impl<I, index_tuple<Indexes...>, T, Types...>
{
typedef typename make_indexes_impl<I + 1, index_tuple<Indexes..., I>, Types...>::type type;
};
template<int I, int... Indexes>
struct make_indexes_impl<I, index_tuple<Indexes...> >
{
typedef index_tuple<Indexes...> type;
};
template<typename ... Types>
struct make_indexes : make_indexes_impl<0, index_tuple<>, Types...>
{};
// ----------- FOR EACH -----------------
template<typename Func, typename Last>
void for_each_impl(Func&& f, Last&& last)
{
f(last);
}
template<typename Func, typename First, typename ... Rest>
void for_each_impl(Func&& f, First&& first, Rest&&...rest)
{
f(first);
for_each_impl(std::forward<Func>(f), rest...);
}
template<typename Func, int ... Indexes, typename ... Args>
void for_each_helper(Func&& f, index_tuple<Indexes...>, std::tuple<Args...>&& tup)
{
for_each_impl(std::forward<Func>(f), std::forward<Args>(std::get<Indexes>(tup))...);
}
template<typename Func, typename ... Args>
void for_each(std::tuple<Args...>& tup, Func&& f)
{
for_each_helper(std::forward<Func>(f),
typename make_indexes<Args...>::type(),
std::forward<std::tuple<Args...>>(tup));
}
template<typename Func, typename ... Args>
void for_each(std::tuple<Args...>&& tup, Func&& f)
{
for_each_helper(std::forward<Func>(f),
typename make_indexes<Args...>::type(),
std::forward<std::tuple<Args...>>(tup));
}
impulso :: fusión es otra opción, pero requiere su propio tipo tupla: impulso :: :: fusión tupla. ¡Mejor nos apeguemos al estándar! Aquí hay una prueba:
#include <iostream>
// ---------- FUNCTOR ----------
struct Functor
{
template<typename T>
void operator()(T& t) const { std::cout << t << std::endl; }
};
int main()
{
for_each(std::make_tuple(2, 0.6, 'c'), Functor());
return 0;
}
el poder de las plantillas variadic!
¿Puedo preguntar, cómo se compila en C++ 0x? Por lo que yo sé, no está publicado ni está listo. – Burkhard
g ++ contiene soporte experimental de algunas características de C++ 0X, incluidas plantillas variadic, desde la versión 4.3. Otros compiladores hacen lo mismo (con diferentes conjuntos de características, si quieres usarlos en producción, estás de vuelta en los 90 con una amplia variedad de soporte para las cosas más avanzadas) – AProgrammer
¿Qué compilador usas? –