関数呼び出しの多重定義

C++関数呼び出し演算子は、多重定義された場合には、関数が呼び出される方法を変更しません。 むしろ、演算子が与えられた型のオブジェクトに適用された場合の、演算子の解釈の仕方を変更します。

任意の数のパラメーターを持つ非静的メンバー関数を使用して、 関数呼び出し演算子 operator() を多重定義します。 あるクラスに対して関数呼び出し演算子を多重定義する場合、その宣言は以下の形式になります。

return_type operator()(parameter_list)

他のすべての多重定義された演算子と異なり、 関数呼び出し演算子の引き数リスト内に、デフォルト引き数と省略符号を指定することができます。

次の例は、コンパイラーがどのように関数呼び出し演算子を解釈するかを示しています。

struct A {
  void operator()(int a, char b, ...) { }
  void operator()(char c, int d = 20) { }
};
 
int main() {
  A a;
  a(5, 'z', 'a', 0);
  a('z');
//  a();
}

関数呼び出し a(5, 'z', 'a', 0) は、a.operator()(5, 'z', 'a', 0) と解釈されます。 これは void A::operator()(int a, char b, ...) を呼び出します。関数呼び出し a('z') は、a.operator()('z') と解釈されます。 これは、void A::operator()(char c, int d = 20) を呼び出します。 コンパイラーは、関数呼び出し a() を許可しません。なぜなら、その引き数リストが、 クラス A に定義された関数呼び出しパラメーター・リストのどれにも一致しないからです。

次の例は、多重定義された関数呼び出し演算子を示しています。

class Point {
private:
  int x, y;
public:
  Point() : x(0), y(0) { }
  Point& operator()(int dx, int dy) {
    x += dx;
    y += dy;
    return *this;
  }
};
 
int main() {
  Point pt;
 
  // Offset this coordinate x with 3 points
  // and coordinate y with 2 points.
  pt(3, 2);
}

上記の例は、クラス Point のオブジェクトの関数呼び出し演算子を再解釈しています。 Point のオブジェクトを関数のように扱って、2 つの整数引き数を渡す場合、 関数呼び出し演算子は、渡した引き数の値を、 それぞれ Point::x および Point::y に加えます。

関連参照

IBM Copyright 2003