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