0

我试图避免使用 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

如果我希望能够调用 method(&B::testCallbackB) 我需要 typedef 一个函数指针并以这种方式进行转换:

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

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

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

有任何想法吗?

4

3 回答 3

5

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

于 2013-08-02T17:51:37.253 回答
4

你可能需要std::bind,比如

B b;
method(std::bind(&B::testCallbackB, b));
于 2013-08-02T17:48:56.950 回答
1

如果我很好地理解了您的问题,那么我建议您将 testCallbackA 设置为 A 类virtual,然后在调用方法时简单地使用 &A::testCallbackA 。

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

于 2013-08-02T18:14:53.957 回答