考虑以下代码:
class Logic {
};
class InheritedLogic : public Logic {
void someMember();
};
void setHandler(void (Logic::*h)(void));
setHandler(InheritedLogic::someMember);
这不能编译,因为:
错误16错误C2664:[..]无法将参数2从'void(__ thishisall InheritedLogic :: *)(void)'转换为'void(__ thiscall Logic :: *)(void)'[..]
我会说InheritedLogic::someMember
属于Logic::*()
类型,但显然不是。
我该如何使这项工作?我正在寻找一种方法来将Logic
类的成员提供给另一个不知道任何可能的继承的类,这样我就可以灵活地使用我可以附加的逻辑处理程序。
答案 0 :(得分:2)
将std/boost ::function
与std/boost:: bind
一起使用。
void setHandler(const std::function<void()>);
setHandler(std::bind(&InheritedLogic::someMember, &object));
答案 1 :(得分:1)
你可以简单地尝试模板:
template <class T>
setHandler(void(*T::pFunction)(void))
现在进行实例化:
setHandler<InheritedLogic>(InheritedLogic::someMember)
答案 2 :(得分:1)
成员函数继承反过来。
struct Logic {
};
struct InheritedLogic : Logic {
void someMember();
};
struct MoreInheritedLogic : InheritedLogic {
};
void setHandler(void (MoreInheritedLogic::*h)(void));
int main () {
setHandler(&InheritedLogic::someMember);
}
这个编译。你的代码没有,因为继承的方式是错误的。
要理解为什么,想象一下你的代码是有效的,并试着在精神上重现如果你打电话会发生什么
Logic* l;
l->*h();
如果问题尚不清楚,请将数据成员添加到InheritedLogic
并让someMember()
访问它。