meta-double

コンパイル時浮動小数点数


ネタ元

http://d.hatena.ne.jp/paserry/20050622

http://d.hatena.ne.jp/Cryolite/20050621



C++ではtemplate引数にdoubleを使用することができない

template <double f> hoge {}; // エラー!doubleは静的型ではありません

しかし、以下のような方法で同様のことができるそうだ

#include <iostream>

using namespace std;

// 円周率
struct pi {
    static double value() { return 3.14; }
};

// 半径
struct radius {
    static double value() { return 5.0; }
};

// 円の面積
template <class Radius>
struct circle_area {
    static double value() { return Radius::value() * Radius::value() * pi::value(); }
};


int main()
{
    // 円の面積計算(5.0 * 5.0 * 3.14)
    cout << circle_area<radius>::value() << endl;
    return 0;
}


この方法(インライン関数でのコンパイル時定数)では
たしかに実行時オーバーヘッドは生じない(インライン化されれば)



だけど、↓これできないよね?(インラインとはいえ関数だから当然だけど)

// コンパイルタイムアサート
template <bool> struct static_assert;
template <> struct static_assert<true> {};


static_assert<circle_area<radius>::value() == 78.5>; // エラー!


これはホントにメタなのか?

単純に速いからいいのかもしれないけど



Boostはこれをマクロ化して可読性を上げているようだ



参考URL
http://thread.gmane.org/gmane.comp.lib.boost.devel/125682

http://d.hatena.ne.jp/yotto-k/20060610

http://boost.cppll.jp/HEAD/libs/mpl/doc/paper/mpl_paper.html