Hatena::ブログ(Diary)

C++でゲームプログラミング

2012-02-13

[][]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)

bigsleepbigsleep 2012/02/13 12:26 どうもありがとうございます。
カンマ演算子でカンマの後ろの値として評価させられるんですね。全然思いつきませんでした。
確かにfusion::for_eachを使ったコードの方がぱっと見なにやってるかわかりやすいような気がします。

osyo-mangaosyo-manga 2012/02/14 00:33 こういうのはもっと素直に書ければ嬉しいんですけどねぇー(´・ω・`)

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/osyo-manga/20120213/1329086110
リンク元