gpt4 book ai didi

c++ - 如何在函数声明中声明 C++ mem_fn(member_function)?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:15:55 26 4
gpt4 key购买 nike

我理解在其类之外传递成员函数地址的基本问题。我觉得 mem_fn() 可能是解决方案,但我在具体细节上遇到了麻烦。

我在类 p 中有一个成员函数,当前声明为

typedef void (*valNamedFlagsCallback)(const int, const bool);
bool valNamedFlags(const OptBlk *operand, const char *description_of_value_or_NULL, const int subscripts[], const char *names[], valNamedFlagsCallback callBack);

在 e 类中,我试图用

调用 valNamedFlags
pInstance->valNamedFlags(operand, "Statement types", statementsSubscripts, statementsNames, std::mem_fn(&e::setStatement));

(我开始时没有使用 mem_fn(),但当然有经典的“指向成员函数的指针”问题。我已经尝试了 &e::setStatement 和普通的 &setStatement。)

FWIW,setStatement 的原型(prototype)为

  void setStatement(const int ifcid, const bool isAffirmative);

如果我删除 mem_fn() 并将 setStatement 声明为静态,则一切正常。我只是指出这一点,以此表示我已经消除了所有其他可能的问题;我唯一的问题是“指向成员函数的指针”问题。不幸的是,setStatement() 需要是成员函数,而不是静态函数。

我在 MS VS 2010 中遇到的具体错误是

bool p::valNamedFlags(const OptBlk *,const char *,const int [],const char *[],p::valNamedFlagsCallback)' : cannot convert parameter 5 from 'std::tr1::_Mem_fn3<_Rx,_Pmf,_Arg0,_Arg1,_Arg2>' to 'p::valNamedFlagsCallback'

我想保持回调声明独立于类e;也就是说,我不想去

typedef void (*e::valNamedFlagsCallback)(const int, const bool);

因为我想让 p 比这更通用。

mem_fn() 是正确的解决方案还是我离题太远了?如果是这样,我应该如何在 valNamedFlags() 原型(prototype)中声明回调?

或者我应该采用不同的方法吗?

最佳答案

实际上,按照某些人的建议,您在执行类似绑定(bind)的操作时会遇到问题,因为您的回调被定义为一个简单的函数指针,而不是一个可调用对象。

如果你负担得起,你可以改变你的

typedef void (*valNamedFlagsCallback)(const int, const bool);

类似于

typedef std::function<void(int, bool)> valNamedFlagsCallback

(还要注意值参数上的 const 不会影响函数的签名),那么您可以使用 std::bind()

using namespace std::placeholders;

pInstance->valNamedFlags(operand,
"Statement types",
statementsSubscripts,
statementsNames,
std::bind(&E::setStatement, e, _1, _2));

或者您可以使用 lambda:

pInstance->valNamedFlags(operand,
"Statement types",
statementsSubscripts,
statementsNames,
[&](int i, bool b) { e->setStatement(i, b); });

如果您必须将它保留为一个简单的函数,那么您必须发送一个引用正确对象的函数作为全局/静态变量。

关于c++ - 如何在函数声明中声明 C++ mem_fn(member_function)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35321362/

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