[英]How to pass a member function pointer to an overloaded method in a template function?
我提到了这个有点相似的问题 。 但是这里的情况有所不同:
struct A
{
void foo (int i) {} // choice
void foo (double i) {}
};
template<typename ObjType, typename FuncPtr>
void ReceiveFuncPtr (ObjType o, FuncPtr pf)
{
(o.*pf)(1);
}
int main ()
{
A obj;
ReceiveFuncPtr(obj, &A::foo); // don't want typecast here
}
在上面的测试代码中,我在A
有一个重载的foo
。 如果只有1 foo
那么代码工作正常。 但对于重载情况,编译器抱怨为:
错误:没有匹配函数来调用`ReceiveFuncPtr(A&,[未解析的重载函数类型])'
在调用ReceiveFuncPtr()
,有没有什么方法可以对template
参数进行一些更改,并使其能够为任何类似的class A
接收foo(int)
版本?
编辑 :想法在调用函数时不要担心类型 。 它应该像ReceiveFuncPtr(obj, &A::foo);
一样简单ReceiveFuncPtr(obj, &A::foo);
让template
完成它的工作。
您可以将函数模板编写为:
template<typename ObjType>
void ReceiveFuncPtr (ObjType o, void (ObjType::*pf)(int) )
{
(o.*pf)(1);
}
此函数模板将自动选择void foo (int i)
。
我之前的回答(不删除它,因为它可能对其他人有帮助) :
你的问题:
ReceiveFuncPtr(obj, &A::foo); // don't want typecast here
你可以这样做:
void (A::*pFun)(int) = &A::foo; // No casting here!
ReceiveFuncPtr(obj, pFun); // No casting here!
pFun
是一个指向void A::f(int)
的指针
您还可以使用typedef:
typedef void (A::*FunDouble)(double);
typedef void (A::*FunInt)(int);
FunInt pFun = &A::foo; // No casting here!
ReceiveFuncPtr(obj, pFun); // No casting here!
这个怎么样:
template<typename ObjType>
void ReceiveFuncPtr (ObjType o, void (ObjType::*pf)(int))
{
(o.*pf)(1);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.