それ pack expansion でできるよ。
#include <tuple> #include <functional> // for result_of template <int ...Indexes> struct IndexTuple { typedef IndexTuple<Indexes..., sizeof...(Indexes)> next; }; template <size_t N> struct BuildIndexTuple { typedef typename BuildIndexTuple<N - 1>::type::next type; }; template <> struct BuildIndexTuple<0> { typedef IndexTuple<> type; }; template <typename Fun, typename ...Args, int ...Indexes> auto apply_impl(Fun fun, std::tuple<Args...> t, IndexTuple<Indexes...> indexes) -> typename std::result_of<Fun (Args...)>::type { return fun(std::get<Indexes>(t)...); } template <typename Fun, typename ...Args> auto apply(Fun fun, std::tuple<Args...> t) -> typename std::result_of<Fun (Args...)>::type { typedef typename BuildIndexTuple<sizeof...(Args)>::type Indexes; return apply_impl(fun, t, Indexes()); }
何故これに気がつけなかったのか。