出現評価
http://d.hatena.ne.jp/shinichiro_h/20061124#1164309160
うやむやにしてたけど触れられてたので書いとく。
C++のコンパイル時計算では、遅延評価とも正格評価とも違う評価のしかたをする、というようなのを主張したくて、怪しげな単語を作ったという経緯。
shinh氏には当たり前すぎて、わざわざ触れるまでもなかったことなのかもしれないのですが、普通のプログラミング言語から、コンパイル時C++に移った人(どんな人だ)がまず悩む点だと思うので一応説明。
template < int N > class loop { typedef typename loop<N-1>::result result; }; typedef loop<30> x; x a;
まず、こんな感じで、無限ループするようなのがあったとして。
/* 条件分岐 */ template < bool cond, typename Then, typename Else > class if_; /* trueだったらThenを返す */ template < typename Then, typename Else > class if_<true,Then,Else> { public: typedef typename Then::result result; }; /* false略 */ /* 無限ループ */ template < int N > class loop { public: typedef typename loop<N-1>::result result; }; /* さてこれは? */ typedef if_<true, int, loop<0>::result >::result x;
Cで書くと、
if ( true ) return int; else while(1) ;
こんな感じ。でも、コンパイル時C++だと、何故か無限ループ。テンプレートの引数になる時点で実体化するから、とか、そんなの。
これをなんとかしたものに、boost::mpl::apply_ifというのがあって…と思ったけど、apply_if見つからん。
ともかく、apply_ifというのがあって、なんかごにょごにょすると、何故か、上のようなコードでも無限ループしない。とか、そういう怪しげな評価順序を表現したいという意味で、怪しげな単語を作ってみましたという話。