Variadic Templates を使用した可変長引数の各要素を取得する

C++ の標準ライブラリだけでやろうとすると std::tuple を使用するのがベターなんですかね。
可変長テンプレート引数以外で Variadic Templates を使ったことがなかったので覚書。

[ソース]

#include <tuple>

template<int Index, typename ...Args>
typename std::tuple_element<Index, std::tuple<Args...>>::type
at_c(Args... args){
    return std::get<Index>(std::make_tuple(args...));
}

template<typename ...Args, int Index = 0>
auto
first(Args&&... args)->decltype(at_c<Index>(args...)){
    return at_c<Index>(args...);
}

template<typename ...Args, int Index = 1>
auto
second(Args&&... args)->decltype(at_c<Index>(args...)){
    return at_c<Index>(args...);
}

template<typename ...Args, int Index = 2>
auto
third(Args&&... args)->decltype(at_c<Index>(args...)){
    return at_c<Index>(args...);
}

#include <iostream>

int
main(){
    std::cout << first (1, 2, 3)               << std::endl;
    std::cout << second(3.14f, 0.14, 3)        << std::endl;
    std::cout << third ("hoge", "foo", "piyo") << std::endl;
    return 0;
}

[出力]

1
0.14
piyo

std::tuple_element メタ関数で型を、std::get 関数で要素を取得します。
他にベターなやり方ってあるかしら?
Variadic Templates に対応した Boost.Fusion が使えれば、もうちょっといろんな事が出来そう。