我正在尝试查看以下内容是否可行。我还在使用旧的Visual Studio 2008 C ++编译器,所以请耐心等待。
说,我有两个派生自一个类的类。两者都具有相同的功能,我想传递它作为从静态函数调用的指针。
这是伪代码:
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);
}
我无法弄清楚,我是否需要为此函数指针模板?
答案 0 :(得分:2)
如果不看CDialog
的代码,很难知道发生了什么。 “{1}}中的”func1“是虚拟的吗?如果是这样,你可以写:
CDialog
如果没有,你确实可以使用模板:
void delayed_call_func1(CDialog& cdialog)
{
... ;
cdialog.func1(v);
}
或者,如果您的旧编译器可以编译boost,那么其中有几个库,例如boost::function
,类似于C ++ 11 std::function
,可以用来提供template <typename CDlgX>
void delayed_call_func1(CDlgX* p)
{
... ;
p->func1(v);
}
对您的成员函数进行任意回调,但我建议您只在更新编译器后再查看 - 然后您也可以使用lambdas。