6

それぞれを別の関数に渡すことができることを私は知っています。それらのすべては、微妙な違いのある代替案のように私には思えます。

  1. 関数ポインタ:関数へのポインタ

  2. 関数オブジェクト:()演算子をオーバーロードしたクラスのインスタンス。関数として機能することができます。

  3. ラムダ関数:その場で定義でき、その一部であるステートメントの存続期間中にのみ存在する無名関数(C ++ 11で新しく導入された)

微妙なため、特定のシナリオでは3つの選択肢のどれが最も適切であるか疑問に思います。それで、そこにいる専門家は、私がさまざまなシナリオでそれらを決定して使用できるように、親切に(いくつかの選択基準について?)いくつかの光を当てました。

4

1 に答える 1

7

function object :構文fで呼び出すことができるオブジェクト。f(x)これには、関数ポインター、オーバーロードされた関数を持つクラス オブジェクト、operator()または関数ポインター/参照への変換関数が含まれます。

標準には、それの簡単な定義があります

関数オブジェクト型は、関数呼び出し (5.2.2、13.3.1.1) で後置式の型にすることができるオブジェクト型 (3.9) です。関数オブジェクトは、関数オブジェクト型のオブジェクトです。

特に、関数または関数参照は、呼び出し可能なエンティティであっても、関数オブジェクトではありません。一部の人々は、「関数オブジェクト」という用語を混同し、オーバーロードされたクラス型オブジェクトのみを意味すると解釈していますoperator()

関数ポインター: 関数へのポインター、エラー、ポインター

ラムダ関数: C++11 ラムダについて言及していると思います。これらは実際には関数ではありませんが、オーバーロードされた を持つ特別なコンパイラ生成クラス タイプの関数オブジェクトですoperator()

于 2012-08-30T21:49:39.637 に答える