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 みたいにループできればカッコイイですよねー(白目。

[コンパイラ]

g++ (GCC) 4.7.0 20110924 (experimental)