-
21-12-2019 - |
質問
与えられた構造体について:
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::function
とstd::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;});
.
所属していません StackOverflow