除了成员函数,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
专门用于执行此操作,那么您也可以使用 lambda 表达式完成工作。
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;});
现场演示