类成员函数指针 - 指向成员的指针具有不同的表示形式;不能在他们之间施放

时间:2017-10-29 18:04:35

标签: c++ function-pointers

我有以下数据类型来提供具有特定原型的类成员的函数指针:

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,这不是优雅的。这有什么标准的方法吗?

1 个答案:

答案 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和处理程序逻辑中,因此您的类保持良好的状态,并且多态和类层次结构处理现在位于处理程序逻辑中。