2008-09-01

テンプレート版たらいまわし関数

Modern C++ Designなど読んでしまったもので、たらいまわし関数をコンパイル時に計算しようと思い立つ。

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 件のコメント: