c ++推导出一个函数指针类型

时间:2012-09-07 16:08:18

标签: c++ templates function-pointers

是否可以从函数参数中推导出非类型 函数指针类型模板参数(函数指针)

template <void(*fptr)()>
  void test(void(*fp)()) { fp(); }

调用此函数我必须显式声明函数模板参数:

test<somefunc>(somefunc);

我知道我也可以这样做:

template <void(*fptr)()>
  void test() { fp(); }

test<somefunc>();

但我只是想知道是否可以这样做:

template <void(*fptr)()>
  void test() { fp(); }

test(somefunc);

是否有可能以这样的方式声明编译器(GCC 4.7)将从函数参数推断出来?

事先非常感谢,真的很想知道如何做到这一点。 布莱恩

4 个答案:

答案 0 :(得分:4)

  

是否可以从函数参数中推导出非类型模板参数(函数指针)?

没有。函数参数是运行时实体,模板参数是编译时实体。要推断出,这样的模板参数必须在运行时推断出来,这是不可能的。

答案 1 :(得分:1)

布莱恩,这似乎是低级C和C ++的混乱。你为什么需要那个?为什么不使用仿函数?

struct clean
{
    void operator() () 
    {
        // do something here        
    }
};

template <typename FuncType> void call_func(FuncType func)
{
    func();
}

// here is how to pass 'clean' to be called
call_func(clean());

有关仿函数的更多信息,例如:http://www.cprogramming.com/tutorial/functors-function-objects-in-c++.html

答案 2 :(得分:1)

我这可以做你想做的事:

声明一个没有函数类型的基本模板:

template <typename T> void test(T fp) { printf("function signature not supported\n"); }

专门研究函数类型(主要是参数个数):

typedef void(fptr0)();
template <> void test(fptr0 fp) { fp(); }
typedef void(fptr1)(int);
template <> void test(fptr1 fp) { fp(1); }

使用不同的签名声明一些测试函数:

void myfn0() { printf("hi 0\n"); }
void myfn1(int x) { printf("hi 1:%i\n",x); }
void myfnD(float y) { printf("hi D %f\n",y); }

现在执行它们:

int main(int,char**) {
   test(myfn0);
   test(myfn1);
   test(myfnD);
   return 0;
}

结果:

hi 0
hi 1:1
function signature not supported

答案 3 :(得分:0)

这是你要找的吗?

#include <iostream>

typedef void (*fptr)();

void f() {
    std::cout << "hello, world\n";
}

template <class fptr> void g(fptr fp) {
    fp();
}

int main() {
    g(f);
    return 0;
}