指向派生 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。
我正在尝试查看以下是否可行。我仍在使用旧的 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。