C での Operator() のオーバーロードの探索 : ファンクターと汎用プログラミング
ブースト信号で見られる、C の () 演算子のオーバーロード図書館は、その目的と慣習性について疑問を引き起こします。この実践の背後にある理由を詳しく見てみましょう。
ファンクター: 関数とオブジェクトの世界の橋渡し
Operator() のオーバーロードは、固有の構造であるファンクターの作成において重要な役割を果たします。関数のような動作とステートフル性を組み合わせたものです。ファンクタは呼び出し間で内部状態を維持し、過去の操作を記憶できるようにします。
ファンクタの例
次のアキュムレータ ファンクタについて考えてみましょう。
struct Accumulator { int counter = 0; int operator()(int i) { return counter += i; } };
ジェネリック プログラミング: ロジックのプラグイン
ファンクターは、ユーザーが指定した関数またはファンクターを使用してアルゴリズムがさまざまな要素に対して動作する、ジェネリック プログラミングで幅広く応用されています。この柔軟性は、std::for_each アルゴリズムで実証されています。
template <typename InputIterator, typename Functor> void for_each(InputIterator first, InputIterator last, Functor f) { while (first != last) f(*first++); }
Operator() の利便性
operator() オーバーロードでは、ファンクターと関数ポインターの両方が許可されます。汎用アルゴリズムにプラグインします。たとえば、次の例を考えてみましょう。
void print(int i) { std::cout << i << std::endl; } ... std::vector<int> vec; // Fill vec // Using a functor Accumulator acc; std::for_each(vec.begin(), vec.end(), acc); // acc.counter contains the vector sum // Using a function pointer std::for_each(vec.begin(), vec.end(), print); // prints all elements
複数の () 演算子: 可能性
一般的な考えに反して、実際に、operator() multiple をオーバーロードすることが可能です。 1クラスで何回も。メソッドのオーバーロード規則に従って、戻り値の型は異なる必要があります。
以上がなぜ C で `operator()` をオーバーロードするのでしょうか?ファンクターと汎用プログラミングの力の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。