tuple を受けて func(tuple.template get(), tuple.template get(), ...) な構文に forward する

技法思いついて

       iヽ、     /ヽ、____
     _ノ _,.ゝ-=-<、__   フ
   _____ゝ'"        `ヽ _ゝ  
   `γ´    ,    、     ヽ\       /!
   ,.イ  /ヽ!、 ノヽ,  /_メ」_ ゝ ', ゝ    ./  l
  く i / ハ rト、  V´,. - 、ゝル  ヽイ  ./   /  あたいったら天才ね
 ,.ヘi`レハ ハイヒ.!      / i   ヽ、/    /
 ', ヽ、ノi  l "  _  ".〈/ ハ   /´゙〉  ./
  \  ハハヽ、  ヽノ  ,.イ ,-、.ヘ. / /  ./
    `〈ヘレヘル`ニi=ニ´ヽVハ. 'y/ / ∠____
     \/´7ヽ!/ //  .!  /´〉ヽ_   7
     r〈_  / }><{ ̄/ i   ! -!_/_/ ) /
    /ヽiゝ/ /   /   ヽ、  ゝ-、_ フ´ヽ、
   〈    、/  ̄ ̄     i `゙'ー─'´  ̄
   `ヽ、 /         :ハ

ってやりたいのだけれど,今ちょっと試す時間無くて後で試したいので,思いついたコードちょっとここに置かせていただきますね!

template<class... T, class... U>
typename std::enable_if<sizeof...(T) != sizeof...(U)>::type
g(std::tuple<T...> t, std::tuple<U...> u)
{
  g(t, std::make_tuple(u, std::integral_constant<std::size_t, sizeof...(U)>()));
}

template<class... T, class... U>
typename std::enable_if<sizeof...(T) == sizeof...(U)>::type
g(std::tuple<T...> t, std::tuple<U...> u)
{
  h(t.template get<U::value>()...);
}

template<class... T>
void f(std::tuple<T...> t)
{
  g(t, std::tuple<>());
}