template <bool flag, typename T1, typename T2> struct Select {
typedef T1 Result;
};
template <typename T1, typename T2> struct Select<false, T1, T2> {
typedef T2 Result;
};
template <int x, int y, int z> struct Tarai;
template <int x, int y, int z> struct Tarai1 {
enum { value = y };
};
template <int x, int y, int z> struct Tarai2 {
enum { value = Tarai<
Tarai<x-1,y,z>::value,
Tarai<y-1,z,x>::value,
Tarai<z-1,x,y>::value
>::value };
};
template <int x, int y, int z>
struct Tarai {
typedef Select< (x <= y), Tarai1<x, y, z>, Tarai2<x, y, z> > Selected;
enum { value = Selected::Result::value };
};
#include <iostream>
int main()
{
//enum { x = 768, y = 384, z = 0 };
enum { x = 384, y = 192, z = 0 };
std::cout << "Tarai(" << x << ", " << y << ", " << z << ") = " << Tarai<x,y,z>::value << std::endl;
}
こんなものかな。しかし、テンプレートメタプログラミングはコンパイラのエラーを理解するのが大変だなあ…
% time g++ -ftemplate-depth-8000 tarai_t.cc
virtual memory exhausted: 資源が一時的に使用できません。
1215.41u 3.25s 22:23.57 90.7%
(´・ω・`)ショボーン
0 件のコメント:
コメントを投稿