我提到了这个somewhat similar question。不过这里的情况有所不同:
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
}
在上面的测试代码中,foo
内部A
超载了foo
。如果只有1 ReceiveFuncPtr()
那么代码工作正常。但对于重载情况,编译器抱怨为:
错误:没有匹配的呼叫功能 到'ReceiveFuncPtr(A&amp;,[未解决 重载函数类型])'
而不是在调用template
时进行显式类型转换,我们是否有任何方法可以对其foo(int)
参数进行一些更改,并使其能够始终为任何类似class A
版本接收ReceiveFuncPtr(obj, &A::foo);
1}}?
修改:在调用该函数时,构思不必担心类型。它应该像template
一样简单,让{{1}}完成它的工作。
答案 0 :(得分:4)
您可以将功能模板编写为:
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!
答案 1 :(得分:4)
怎么样:
template<typename ObjType>
void ReceiveFuncPtr (ObjType o, void (ObjType::*pf)(int))
{
(o.*pf)(1);
}