37

cppreferenceから、次のことがわかりました。

クラス テンプレート std::function は、汎用のポリモーフィック関数ラッパーです。std::function のインスタンスは、任意の Callable ターゲット (関数、ラムダ式、バインド式、またはその他の関数オブジェクト、メンバー関数へのポインター、データ メンバーへのポインター) を格納、コピー、および呼び出すことができます。

なぜ a がそのようなポインターを格納できるのかがわかりませんstd::function。また、その機能について聞いたことがありません。
それは本当に可能ですか、私は何かを逃したか、それはドキュメントのエラーですか?

そのような場合、どのようにoperator()振る舞うべきですか?ドキュメント
からのように:

パラメーター args を使用して、格納されている呼び出し可能な関数ターゲットを呼び出します。

とにかく、ここで呼び出す呼び出し可能な関数ターゲットは格納されていません。私が間違っている?

正直なところ、そのような関数の正しい構文を理解することさえできません。そうでなければ、それをテストするために例を書いたでしょう。
次のテンプレートを使用して、データ メンバーへのポインターを定義するにはどうすればよいでしょうか?

template< class R, class... Args >
class function<R(Args...)>
4

1 に答える 1

26

の関数呼び出し演算子への呼び出しの効果std::function<R(ArgTypes...)>:

R operator()(ArgTypes... args) const

(§ 20.9.11.2.4 [func.wrap.func.inv]/p1 ) と同等です。

INVOKE<R>(f, std::forward<ArgTypes>(args)...)

その定義には次の箇条書きが含まれます (§ 20.9.2 [func.require]/p1 ):

INVOKE (f、t1、t2、...、tN) を次のように定義します。

[...]

1.3 —およびt1.*fがクラスのメンバ データへのポインタであり、型のオブジェクト、型のオブジェクトへの参照、または から派生した型のオブジェクトへの参照である場合。N == 1fTt1TTT

次に、fが の内部呼び出し元に格納されているデータ メンバへのポインタであるstd::function場合、std::functionそれ自体が 1 つの引数を定義する必要があります。たとえば、次のようになります。

std::function<int(std::pair<int,int>)> f = &std::pair<int,int>::first;

f(std::make_pair(1, 2));

デモ

于 2016-02-16T18:07:33.643 に答える