eldeshの日記: c++0x::foldlできたw
#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
# 眠い…
c++0x::foldlできたw More ログイン