-
21-12-2019 - |
题
对于给定的结构:
struct foo
{
void fooFunc(){}
int fooVar = 0;
};
我可以创建一个对该函数的调用 wapper: std::mem_fn( &foo::fooFunc )
这样我就可以将它传递到另一个方法并在对象上调用它。
我想知道是否有类似的调用包装器,但用于成员变量。
例如,我在这里使用指向成员变量的指针,但我想使用调用包装器:
void bar( std::function< void( foo ) > funcPtr, int foo::* varPtr )
{
foo myFoo;
funcPtr( myFoo );
foo.*varPtr = 13;
}
解决方案
注意:你的问题中没有任何内容来自STL(这是一个20世纪90年代的图书馆), 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
为此,您也可以使用 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;});
不隶属于 StackOverflow