質問

与えられた構造体について:

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

私は関数にCall Wapperを作成できます.std::mem_fn( &foo::fooFunc )では別のメソッドに渡してオブジェクトに呼び出すことができます。
私は似たようなコールラッパーがあるかどうかを知りたいですが、メンバー変数のために。

例えば、ここではメンバー変数へのポインタを使用していますが、コールラッパーを使用します。

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

役に立ちましたか?

解決

n.b。あなたの質問には何もstl(1990年代の図書館)からのものでは、std::functionstd::mem_fnはC ++標準ライブラリの一部です。

std::mem_fnは、メンバー関数とメンバ変数をサポートしているため、メンバー変数にアクセスして設定するためにこれを行うことができます。

foo f;
std::function<int&(foo&)> var( std::mem_fn( &foo::fooVar ) );
var(f) = 1;
.

他のヒント

メンバー関数に加えて、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データメンバーを設定するための呼び出し可能な呼び出し可能な方法であり、具体的にこれを行うために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;});
.

Live Demo

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top