1

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

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

4 回答 4

4

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

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

于 2012-09-07T16:10:07.620 回答
1

Bryan,这似乎是低级 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

于 2012-09-07T16:19:51.950 回答
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
于 2012-09-07T16:31:44.973 回答
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;
}
于 2012-09-07T16:46:31.270 回答