我有以下数据类型来提供具有特定原型的类成员的函数指针:
template<typename T> using FooHandler = bool(T::*)(BaseClass*, bool);
我想用它来引用以下成员函数:
bool ClassName::MethodName(DerivedClass* msg, bool byRef)
其中DerivedClass是一个派生自抽象BaseClass的类。但是,这给出了编译错误&#34;指向成员的指针有不同的表示形式;不能在他们之间施放&#34;。
我的用途是能够在通用例程中使用以下表达式:
BaseClass* classInstance = container[index];
FooHandler<BaseClass> handler = classInstance->inputHandler;
bool result = (classInstance->*handler)(data, true);
简单的解决方法是将成员函数的原型更改为:
bool ClassName::MethodName(BaseClass* msg, bool byRef)
但这意味着我必须在方法实现中将msg转换回DerivedClass,这不是优雅的。这有什么标准的方法吗?
答案 0 :(得分:0)
在这种情况下你必须亲自制作演员。如果您不想在任何地方执行转换,则可以使用指向自由函数的指针而不是指向成员函数的指针。这样,您可以使用没有捕获的lambda:
template<typename T>
using FooHandler = bool(*)(T*, BaseClass*, bool);
// later on...
FooHandler<BaseClass> foo = [](BaseClass* c, BaseClass* p, bool b) {
return c->inputHandler(static_cast<Derived*>(p), b);
};
foo(baseClass, derived, true); // call to the function.
当然,您也可以使用std::function
:
using FooHandler = std::function<bool(BaseClass*, bool)>;
// later on...
SomeClass c;
// v--- captures c into the lambda
FooHandler foo = [c](BaseClass* p, bool b) {
return c->someFunction(p, b);
};
两种方式都必须进行演员表演。但是,该转换在SomeClass
代码中不再存在,而是在lambda和处理程序逻辑中,因此您的类保持良好的状态,并且多态和类层次结构处理现在位于处理程序逻辑中。