指向派生 class 中函数的虚函数指针

Virtual function pointer to a function in a derived class

我正在尝试查看以下是否可行。我仍在使用旧的 Visual Studio 2008 C++ 编译器,请耐心等待。

比如说,我有两个 class 派生自一个 class。两者都具有相同的功能,我想将其作为要从静态函数调用的指针传递。

这是伪代码:

class CDlg1 : public CDialog
{
    virtual void func1(int v)
    {
        wprintf(L"CDlg1::func1 was called, v=%d\n", v);
    }

    void do_delayed_call()
    {
        delayed_call_func1(func1);
    }
}

class CDlg2 : public CDialog
{
    virtual void func1(int v)
    {
        wprintf(L"CDlg2::func1 was called, v=%d\n", v);
    }

    void do_delayed_call()
    {
        delayed_call_func1(func1);
    }
}



static void delayed_call_func1(void* pfn)
{
    //... some additional action
    //int v = something

    //Call pfn() after a delay
    pfn(v);
}

我想不通,我需要为这个函数指针做模板吗?

不看 CDialog 的代码就很难知道发生了什么。 "func1" 在 CDialog 中是虚拟的吗?如果是这样,你可以写:

void delayed_call_func1(CDialog& cdialog)
{
    ... ;
    cdialog.func1(v);
}

如果没有,您确实可以使用模板:

template <typename CDlgX>
void delayed_call_func1(CDlgX* p)
{
    ... ;
    p->func1(v);
}

或者,如果您的旧编译器可以编译 boost,其中有几个库,例如 boost::function that are similar to the C++11 std::function,可用于为您的成员函数提供 delayed_call_func1 任意回调,但我建议您只在更新编译器后查看它 - 然后您也可以使用 lambdas。