鍋あり谷あり

テーマを決めずに適当に書いています。

引数の数が違うけど中身は対して違わない関数

コメントありがとうございます>shelarcy 様
で。
C99 で導入された可変長引数マクロですが、可変長引数マクロは、可変長引数マクロを可変長引数関数(または別の可変長引数マクロ)に置換するだけで、結局可変長引数関数に落ちます。
私が先日(id:Nabetani:20050818:p1)書いたのは、その落ちる先の可変長引数関数は、rubypython のようなもので生成するほかないという話です。
例えば、こんな

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 );

に比べると嫌われがちだとも思います。私はむしろ好きですが。