我理解将成员函数的地址传递到类之外的基本问题。我感觉 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 的原型为
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)' : 无法将参数 5 从 'std::tr1::_Mem_fn3<_rx _arg0>' 到 'p::valNamedFlagsCallback'
我想保持回调声明独立于类 e;也就是说,我不想去
typedef void (*e::valNamedFlagsCallback)(const int, const bool);
因为我想让 p 比这更普遍。
mem_fn() 是正确的解决方案还是我离谱了?如果是这样,我应该如何在 valNamedFlags() 原型中声明回调?
或者我应该采取不同的方法?