コメントありがとうございます>shelarcy 様
で。
C99 で導入された可変長引数マクロですが、可変長引数マクロは、可変長引数マクロを可変長引数関数(または別の可変長引数マクロ)に置換するだけで、結局可変長引数関数に落ちます。
私が先日(id:Nabetani:20050818:p1)書いたのは、その落ちる先の可変長引数関数は、ruby や python のようなもので生成するほかないという話です。
例えば、こんな
double wave( double w0, double v0, double w1, double v1, double w2, double v2 ) { double w = w0+w1+w2; return ( w0*v0 + w1*v1 + w2*v2 ) / w; }
関数(加重平均を計算する関数のつもり)を、引数の数を可変(偶数個という条件付きで)にするのは困難です。
もちろん、Cの古典的な可変長引数の仕組みを使い、番兵は NaN にするという手もありますが、それでは型の安全が保証されません(int を積むだけで死ぬ)し、関数テンプレートにすることもできません。
実際、boost::tuple は、python が生成しているコードのようです。
C++ であれば
double a = WAve( 1, 100 )( 2, 20 )( 1.2, 40 );
というような使い方をする Wave クラスを作ることは可能ですが、それはまた別の話というべきでしょうし、普通の関数呼び出しとの直行性ということを考えると不自然です(WAve の直後の括弧とそれ以外の括弧で意味が違うのが気持ち悪いし)。
double a = wave( 1, 100, 2, 20, 1.2, 40 );
に比べると嫌われがちだとも思います。私はむしろ好きですが。