繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM