如何将成员函数指针传递给模板函数中的重载方法?

时间:2011-06-17 04:59:19

标签: c++ templates overloading member-function-pointers

我提到了这个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}}完成它的工作。

2 个答案:

答案 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);
}