パスワードを忘れた? アカウント作成
88418 journal

eldeshの日記: c++0x::foldlできたw

日記 by eldesh
朝になってしまった…\(^o^)/

#include <iostream>
#include <typeinfo>
#include <tuple>
#include <cxxabi.h>
#include <string>

using namespace std;

template< typename hd, typename ...tl >
struct head {
    typedef hd type;
};

template< typename hd, typename ...tl >
struct head<tuple<hd, tl...>> {
    typedef hd type;
};

template< typename hd, typename ...tl >
struct tail {
};

template< typename hd, typename ...tl >
struct tail<tuple<hd,tl...>> {
    typedef tuple<tl...> type;
};

template< template<typename T> class F, typename ...XS >
struct map {
};

template< template<typename T> class F, typename... XS >
struct map<F, tuple<XS...>> {
    typedef tuple<typename F<XS>::type...> type;
};

template< typename X, typename Y >
struct compose {
    typedef tuple<X,Y> type;
};

template< typename X, typename Y, typename ...TL >
struct compose<X, tuple<Y,TL...>> {
    typedef tuple<X,Y,TL...> type;
};

template< template< class T, class U > class F, typename T0, typename Seq >
struct foldl {
};

template< template< class T, class U > class F, typename T0, typename H, typename ...TL >
struct foldl<F, T0, tuple<H,TL...>> {
    typedef typename foldl< F,
            typename F<H, T0>::type,
            tuple<TL...>
        >::type type;
};

template< template< class T, class U > class F, typename T0 >
struct foldl<F, T0, tuple<>> {
    typedef T0 type;
};

int main(){

    int p;
    string name( typeid(
        foldl<compose,
            int,
            tuple<int, char, double, string>>::type
        ).name());

    cout << abi::__cxa_demangle(name.c_str(), 0, 0, &p) << endl;

    return 0;
}

gcc4.4.0@cygwinで動作確認.
合ってるか自信ないけど, foldl出来たw
T0は第一引数型(?)Fの後ろ(第二引数)で適用されることに注意.
でもこの例だとcomposeをそのまま使うだけでいいじゃんwというオチが...orz
実用的な(型の)二項演算ってすぐに思いつかないw

variadic templateのコツとしては, (...)を特殊化として使うところか.
あとこれは仕様じゃないと思うんだけど, gcc4.4.0だと, template内で(...)をそのままtypedef出来ないのが残念で,
なんかある度にstd::tupleを使わないといけない.(tailとか)

typedef       tl...  type; // NG
typedef tuple<tl...> type; // OK

# 眠い…

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

「科学者は100%安全だと保証できないものは動かしてはならない」、科学者「えっ」、プログラマ「えっ」

読み込み中...