それ 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());
}

何故これに気がつけなかったのか。