2018年02月22日
《その303》 ファンクタ
ファンクタ(functor, 関数オブジェクト)
下記のプログラムの、クラステンプレート C<> 中の
ファンクタと呼ばれるメンバ関数 operator()関数は、()演算子が多重定義されたものです。
下記のプログラムの場合は、operator()は、引数を受け取らない関数です。
この関数は、クラスオブジェクトが保持しているデータメンバ value の値を表示した後、
その value に 1 を加えます。
したがって、operator()関数が呼び出される度に、value の値は 1 ずつ増加することになります。
データメンバ value は、コンストラクタによって初期値が与えられますが、
その後は、operator()関数が呼び出されることによって変化していきます。
クラステンプレート C<> は、キーワード class ではなく、
struct で定義されています。
したがって、operator()関数 や コンストラクタには、public属性が与えられています。
なお、オブジェクト c0 の operator()関数を呼び出すには、c0(); と記述します。
以下はプログラムです。
#include <iostream>
template <class T> struct C {
C(T v) : value(v) { }
void operator()() {
std::cout << value << ' ';
value++;
}
private:
T value;
};
int main() {
C<int> c0(10);
for (int i = 0; i < 6; i++)
c0();
std::cout << '\n';
C<int> c1 = c0;
for (int i = 0; i < 3; i++)
c1();
std::cout << '\n';
C<char> c2('A');
for (int i = 0; i < 10; i++)
c2();
std::cout << '\n';
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7350390
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック