1

特定の構造体の場合:

struct foo
{
    void fooFunc(){}
    int fooVar = 0;
};

関数への呼び出しワッパーを作成できstd::mem_fn( &foo::fooFunc )ます。これにより、別のメソッドに渡してオブジェクトで呼び出すことができます。
同様の呼び出しラッパーがあるかどうかを知りたいのですが、メンバー変数用です。

たとえば、ここではメンバー変数へのポインターを使用していますが、呼び出しラッパーを使用したいと思います。

void bar( std::function< void( foo ) > funcPtr, int foo::* varPtr )
{
    foo myFoo;
    funcPtr( myFoo );
    foo.*varPtr = 13;
}
4

2 に答える 2

5

メンバー関数に加えて、std::mem_fnデータ メンバーもラップして、それらへの読み取りアクセスを許可できます。したがって、次のように動作します。

void print_fooVar(foo& f, std::function<int(foo)> varAccess)
{
    std::cout << varAccess(f) << std::endl;
}

foo f;
print_fooVar(f, std::mem_fn(&foo::fooVar)); // prints 0

JonathanWakely がコメントで言及しているように、mem_fnそれ自体によって返される (未指定の) タイプを使用して、データ メンバーを設定できます。

foo f;
std::mem_fn(&foo::fooVar)(f) = 13;

std::functionまたはそれを用途に変換する

void bar( foo& f, std::function<int&(foo&)> fooVarSet )
{
    fooVarSet(f) = 26;
}

探しているのが、fooVarデータ メンバーを設定するための callable を生成する方法だけでstd::mem_fnあり、これを行うために特に使用しない場合は、ラムダ式を使用してジョブを完了することもできます。

void bar( foo& f, std::function<void(foo)> funcPtr, 
                  std::function<void(foo&, int)> fooVarSet )
{
    funcPtr( f );
    fooVarSet(f, 13);
}

foo f;
bar(f, std::mem_fn(&foo::fooFunc), [](foo& f, int i) {f.fooVar = i;});

ライブデモ

于 2014-06-04T13:11:07.140 に答える