使用带有函数指针参数的模板

时间:2011-09-21 01:56:27

标签: templates function pointers

我想知道如何使用带有函数指针的模板作为参数。例如,

template<typename T> someFunction(T /*?*/) {}

其中T是函数指针(例如void (*)(int,int*,double)

我想用它来绕过两个函数的函数指针的差异问题,例如:

void function(int,int);
void class::function(int,int);

那么,如果函数指针不起作用,还有另一种方法吗?

编辑:基本上,我需要通过使用模板创建一个接受各种函数的函数(就像常规模板函数接受各种变量一样)。

3 个答案:

答案 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