関数呼び出し演算子は、多重定義された場合には、関数が呼び出される方法を変更しません。
むしろ、演算子が与えられた型のオブジェクトに適用された場合の、演算子の解釈の仕方を変更します。
任意の数のパラメーターを持つ非静的メンバー関数を使用して、 関数呼び出し演算子 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 に加えます。
関連参照