ホームページ >バックエンド開発 >C++ >なぜ C で `operator()` をオーバーロードするのでしょうか?ファンクターと汎用プログラミングの力

なぜ C で `operator()` をオーバーロードするのでしょうか?ファンクターと汎用プログラミングの力

Barbara Streisand
Barbara Streisandオリジナル
2024-11-11 07:01:03848ブラウズ

Why Overload the `operator()` in C  ? Functors and the Power of Generic Programming

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。