gpt4 book ai didi

c++ - 成员变量指针

转载 作者:太空宇宙 更新时间:2023-11-03 10:28:50 30 4
gpt4 key购买 nike

对于给定的结构:

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;
}

最佳答案

除了成员函数,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;});

Live demo

关于c++ - 成员变量指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24037118/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com