将函数定义为模板参数的不同方法是通过或不传递的

时间:2018-01-02 06:56:15

标签: c++ templates

让:

int id(int x) { return x; }

以下代码使用GCC编译:

template <typename F> int f2(F f, int x) { return f(x); }

int id2(int x) { return f2(id, x); }

但以下内容无法编译:

template <typename F> int f1(int x) { return F(x); }

int id1(int x) { return f1<id>(x); }

有人可以解释一下这有什么问题吗?

1 个答案:

答案 0 :(得分:4)

它不会编译,因为sum需要一个类型,而你正在给它一个函数,例如typename F这是一个非类型模板参数。

int(*F)(int)

这可以进一步简化,并使用C ++ 17更加通用:

int id(int x) { return x; }

template <int(*F)(int)> // here
int f1(int x) { return F(x); }

int id1(int x) { return f1<id>(x); }