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 が使えれば、もうちょっといろんな事が出来そう。