Variadic Templates 引数を受け取る for_each 関数
ガシガシ書いてみた。
[ソース]
#include <iostream> #include <tuple> template<typename F, typename T, typename ...Args> void for_each_impl(F func, T&& t, Args&&... args){ func(t); for_each_impl(func, args...); } template<typename F> void for_each_impl(F, F){} template<typename ...Args> void for_each(Args&&... args){ // 関数オブジェクトが先頭になるように挿入 for_each_impl(std::get< sizeof...(Args) - 1 >(std::make_tuple(args...)), args...); } struct disp{ template<typename T> void operator ()(T v) const{ std::cout << v << std::endl; } }; template<typename ...Args> void func(Args&&... args){ for_each(args..., disp()); } int main(){ func(1, 2, 3); func(42, "hoge", 3.14f); for_each(1, 2, 3, 4, 5, [](int n){ std::cout << n << ", "; }); return 0; }
[出力]
1 2 3 42 hoge 3.14 1, 2, 3, 4, 5,
関数オブジェクトを最後に渡しているのでちょっとややこしい事をしていますが、まぁ再帰しているだけですね。
こういう時に多相ラムダが欲しくなる…!
range-based for みたいにループできればカッコイイですよねー(白目。