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