我想知道如何使用带有函数指针的模板作为参数。例如,
template<typename T> someFunction(T /*?*/) {}
其中T是函数指针(例如void (*)(int,int*,double)
)
我想用它来绕过两个函数的函数指针的差异问题,例如:
void function(int,int);
void class::function(int,int);
那么,如果函数指针不起作用,还有另一种方法吗?
编辑:基本上,我需要通过使用模板创建一个接受各种函数的函数(就像常规模板函数接受各种变量一样)。
答案 0 :(得分:0)
成员函数指针是一个与函数指针不同的野兽,例如,它们有一个额外的this
参数。它并不完全清楚你想要完成什么,听起来像Boost.Function / Bind会有所帮助。请注意,它们是TR1以来的标准。
答案 1 :(得分:0)
您可以使用仿函数代替指向成员函数的指针。一个例子:
class SomeFunctor {
public:
void operator()(int i, int* ip, double d)
{
}
};
void someFunction(int i, int* ip, double d)
{
}
template<typename T>
void doSomething(T f)
{
int i = 0, j = 0;
int* ip = &j;
double d;
f(i, ip, d);
}
SomeFunctor someFunctor;
doSomething(someFunctor);
doSomething(someFunction);
请注意,我尚未测试此代码,因此可能需要进行一些修改才能使其编译。
答案 2 :(得分:0)
你应该看一下std :: function;这是一种持有“仿函数”的通用方法,这是你可以调用的东西。 (参见npclaudiu对一种仿函数的回答)
话虽如此,K-ballo是正确的,成员函数不同于自由函数,因为它需要一个对象。 这通常通过传入隐藏参数来实现;你可以称之为“这个”。
所以当你写void my_class::function(int,int);
编译器确实生成void my_class::function (my_class*,int,int);
您可以使用std :: bind关联数据和函数 - 动态创建仿函数。 我所知道的最好的教程是Boost.Bind