6

標準の$ 20.8.2は、標準ライブラリ全体で可変引数リストを使用してcallableを呼び出す方法を説明するために主に使用されるINVOKE機能について説明しています。

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

(t1.*f)(t2, ..., tN)f がクラス T のメンバ関数へのポインタであり、t1 が型 T のオブジェクト、型 T のオブジェクトへの参照、または T から派生した型のオブジェクトへの参照である場合。

((*t1).*f)(t2, ..., tN)f がクラス T のメンバー関数へのポインターであり、t1 が前の項目で説明されている型のいずれでもない場合。

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

(*t1).*fN == 1 であり、f がクラス T のメンバ データへのポインタであり、t1 が前の項目で説明されている型のいずれでもない場合。

f(t1, t2, ..., tN)その他のすべての場合。

3番目と4番目のアイテムは何ですか? 私が知る限り、呼び出し可能fであっても呼び出しませんf。それらのユーザーケースは何ですか。多分それは標準のタイプミスであり、*f()意図されたものでしょうか?

4

1 に答える 1

10

INVOKEメンバー データ ポインターを実際にバインドできるため ( および を介しbindmem_fn) 、次のように指定されます。

§20.8.10 [func.memfn]

template<class R, class T>
unspecifiedmem_fn(R T::* pm);

p1戻り値:fnfn(t, a2, ..., aN)が (20.8.2) と同等になる単純な呼び出しラッパー ( INVOKE(pm, t, a2, ..., aN)20.8.1)。がメンバ関数へのポインタである場合の戻り値の型と同義でfnあるネストされた型を持つものとします。result_typepm pm

メンバー データ ポインターをバインドできなければ、特別な言い回しは存在しないと思います。

#include <functional>
#include <iostream>

struct X{
  int n = 5;
};

int main(){
  X x;
  auto f = std::mem_fn(&X::n);
  std::cout << f(&x) << "\n";
}

出力: 5

実例。

于 2012-09-28T10:59:33.837 に答える