1

对于给定的结构:

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;
}
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数据成员的方法,而不是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;});

现场演示

于 2014-06-04T13:11:07.140 回答
3

注意您的问题中没有任何内容来自 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;
于 2014-06-04T13:24:08.700 回答