簡単な練習
これと同じようなことをするコードがどこかにあったと思うのだが。ってそうそう、id:Cryoliteさんのところにあったと思う。using std::forward;
using std::tuple;
using std::get;template<size_t ...Seq>
struct counting_sequence {};template<size_t N, size_t ...Seq>
struct make_counting_sequence_impl {
typedef typename make_counting_sequence_impl<N - 1, N, Seq...>::type type;
};template<size_t ...Seq>
struct make_counting_sequence_impl<0, Seq...> {
typedef counting_sequence<(Seq - 1)...> type;
};template<size_t Max>
struct make_counting_sequence {
typedef typename make_counting_sequence_impl<Max>::type type;
};
template<typename F, typename ...Params, size_t ...IntSeq>
auto apply_impl(F && f, tuple<Params...> && params, counting_sequence<IntSeq...> count)
->decltype(f(get<IntSeq>(forward<tuple<Params...>>(params))...))
{
return f(get<IntSeq>(forward<tuple<Params...>>(params))...);
}template<typename F, typename ...Params>
auto apply(F && f, tuple<Params...> && params)
->decltype(apply_impl(forward<F>(f),
forward<tuple<Params...>>(params),
typename make_counting_sequence<sizeof...(Params)>::type()))
{
return apply_impl(forward<F>(f),
forward<tuple<Params...>>(params),
typename make_counting_sequence<sizeof...(Params)>::type());
}void f() {
apply([](int, double){}, { 1, 42.0 });
apply([](){},{});
}