tupleを展開して関数に渡す関数

tupleを展開して関数に渡す関数
boostを使えば出来るらしいけど、知らない。
出来栄えはかなり雑です。

template <class F, class... Ts, class... Us>
typename std::enable_if<
	sizeof...(Us) == sizeof...(Ts),
	std::result_of_t<F(Ts...)>>::type
	apply_impl(F&& fun, std::tuple<Ts...>&, Us&... us)
{
	return fun(us...);
}
template <class F, class... Ts, class... Us>
typename std::enable_if<
	sizeof...(Us) < sizeof...(Ts),
	std::result_of_t<F(Ts...)>>::type
	apply_impl(F&& fun, std::tuple<Ts...>& args, Us&... us)
{
	return apply_impl(fun, args, us..., std::get<sizeof...(Us)>(args));
}
template <class F, class... Ts>
std::result_of_t<F(Ts...)> apply(F&& fun, std::tuple<Ts...>& args)
{
	return apply_impl(fun, args);
}

使用例

template <class... Ts>
auto pop_front(std::tuple<Ts...>& args)
{
	return apply([](auto&&, auto&&... v) {return std::make_tuple(v...); }, args);
}