是否可以从函数参数中推导出非类型 函数指针类型模板参数(函数指针)?
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)将从函数参数推断出来?
事先非常感谢,真的很想知道如何做到这一点。 布莱恩
答案 0 :(得分:4)
是否可以从函数参数中推导出非类型模板参数(函数指针)?
没有。函数参数是运行时实体,模板参数是编译时实体。要推断出,这样的模板参数必须在运行时推断出来,这是不可能的。
答案 1 :(得分:1)
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;
}