std :: function参数子类

时间:2013-08-02 17:42:32

标签: c++ c++11

我试图避免使用C风格的函数指针来支持std :: function对象,但是在继承时调用成员函数时遇到了问题。

我有一个接收std :: function的方法:

class A
{
public:
    void testCallbackA();

    // this is unrelated, but I need some features from the superclass
    void goingToNeedThisWhenCallingTestCallbackA(int someParams); 
};

void method(std::function<void(A*)> callback);

method(&A::testCallbackA); // this works fine 

现在好了,但是当我想在方法中使用A子类时,我需要强制转换函数指针:

class B : public A
{
public:
    void testCallbackB() { }
};

method(&B::testCallbackB); // this fails

std::function<void(A*)> call = &B::testCallbackB; // this fails
std::function<void(B*)> call = &B::testCallbackB; // this works

如果我想能够调用方法(&amp; B :: testCallbackB),我需要输入一个函数指针并以这种方式强制转换:

typedef void (A::*Callback)();

std::function<void(A*)> call = (Callback)&B::testCallbackB; // this works

我可以避免这种typedef吗?我可以避免演员吗?我试过没有运气的std :: bind。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

此转化应该失败,因为这是一个坏主意。 std::function<void(A*)>可以使用任何 A*调用,无论指向的实际对象是否为B。在B上调用A成员函数而非B的结果是未定义的行为。

答案 1 :(得分:4)

您可能需要std::bind,例如

B b;
method(std::bind(&B::testCallbackB, b));

答案 2 :(得分:1)

如果我理解你的问题,那么我建议你在A类虚拟中制作testCallbackA,然后在调用方法时简单地使用&amp; A :: testCallbackA。

动态方法调度将负责调用实际类的方法,而不必手动规避类型安全。