2

我提到了这个有点相似的问题。但是这里的情况不同:

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
}

在上面的测试代码中,我有一个重载的fooinside A。如果只有 1foo则代码可以正常工作。但是对于重载的情况,编译器会抱怨:

错误:没有匹配的函数调用 `ReceiveFuncPtr(A&, [未解决的重载函数类型])'

除了在调用时进行显式类型转换ReceiveFuncPtr(),我们有什么方法可以对其template参数进行一些更改并使其foo(int)始终能够接收任何类似的版本class A

编辑:想法是在调用函数时不要担心类型。它应该很简单,ReceiveFuncPtr(obj, &A::foo);让其template发挥作用。

4

2 回答 2

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!
于 2011-06-17T05:06:00.513 回答
4

这个怎么样:

template<typename ObjType>
void ReceiveFuncPtr (ObjType o, void (ObjType::*pf)(int))
{
 (o.*pf)(1);
}
于 2011-06-17T05:13:44.450 回答