Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将成员函数指针传递给模板函数中的重载方法?_C++_Templates_Overloading_Member Function Pointers - Fatal编程技术网

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

C++ 如何将成员函数指针传递给模板函数中的重载方法?,c++,templates,overloading,member-function-pointers,C++,Templates,Overloading,Member Function Pointers,我提到这一点。但是,这里的情况有所不同: 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,

我提到这一点。但是,这里的情况有所不同:

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 { voidfoo(inti){}//choice void foo(double i){} }; 模板 无效接收函数(对象类型o,函数类型pf) { (o.*pf)(1); } int main() { obj; ReceiveFuncPtr(obj,&A::foo);//不希望在此处进行类型转换 } 在上面的测试代码中,我在
A
内部有一个重载的
foo
。如果只有1个
foo
,那么代码工作正常。但对于重载情况,编译器抱怨如下:

错误:没有用于调用的匹配函数 to`ReceiveFuncPtr(A&,[unresolved] 重载函数类型(

在调用
ReceiveFuncPtr()
时,我们是否可以对其
模板
参数进行一些更改,并使其能够始终为任何类似的
A类
接收
foo(int)
版本,而不是显式类型转换


编辑:想法是调用函数时不必担心类型。它应该简单到,
ReceiveFuncPtr(obj,&A::foo)并让
模板
完成其工作。

您可以将函数模板编写为:

template<typename ObjType>
void ReceiveFuncPtr (ObjType o, void (ObjType::*pf)(int) )
{
   (o.*pf)(1);
}
您可以这样做:

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);
}
模板
void ReceiveFuncPtr(对象类型o,void(对象类型::*pf)(int))
{
(o.*pf)(1);
}

我更喜欢打字,而不是那个版本:)。这样做的目的是在编写代码时不必担心
A::foo
类型。模板应该像我在问题中建议的那样推断出它,
我们可以对其模板参数进行一些更改的任何方式
@iammilind:请参阅我的上一个解决方案。:-)+1,没错。实际上我试过了,但我忘了删除导致错误的第二个模板参数
FuncPtr
。我建议不要这样做,因为如果您将派生类对象作为第一个参数传递,并将指向基类函数的指针作为第二个参数传递,则会出现错误。请定义“对于任何类似的类a”的含义,这样可以更好地帮助您。
template<typename ObjType>
void ReceiveFuncPtr (ObjType o, void (ObjType::*pf)(int))
{
 (o.*pf)(1);
}