Variadic Templates を展開して関数を評価する

戻り値型が void の場合はこんな感じかしら。

[ソース]

#include <iostream>
#include <initializer_list>

template<typename T>
void
expand(std::initializer_list<T>){}

template<typename T>
void
disp_impl(T t){
    std::cout << t << std::endl;
}

template<typename ...Args>
void
disp(Args... args){
    expand({ (disp_impl(args), 0)... });

    // expand を使いたくないならば
//     auto n = { (disp_impl(args), true)... };
}


int
main(){
    disp("hello", 42, "world");
    return 0;
}

[出力]

hello
42
world

カンマ演算子を利用して、ダミーの値を使用しています。
関数の評価自体はされるのでこれで問題ないかな。


ちなみに Boost.Fusion を使うとこんな感じです。

#include <iostream>
#include <boost/fusion/include/for_each.hpp>
#include <boost/fusion/adapted/std_tuple.hpp>

struct disp_impl{
    template<typename T>
    void
    operator ()(T&& t) const{
        std::cout << t << std::endl;
    }
};

template<typename ...Args>
void
disp(Args... args){
    boost::fusion::for_each(std::make_tuple(args...), disp_impl());
}

int
main(){
    disp("hello", 42, "world");
    return 0;
}

Boost 1.48.0 から std::tuple のアダプタが追加されたので Variadic Templates も使用することが出来ます。
こっちの方がスマートかなー。

[コンパイラ]

  • g++ (GCC) 4.7.0 20111210 (experimental)