我有模板功能,函数指针作为模板参数。当我使用全局函数指针作为模板参数时,一切正常。当我尝试使用lambda本地定义函数(没有捕获)时出现问题。 这是最小的代码:
#include <vector>
#include <iostream>
template<double (*f)(double, double)>
std::vector<double> calculate(std::vector<double>& x, std::vector<double>& y){
std::vector<double> z(x.size());
std::transform(x.begin(),x.end(),y.begin(),z.begin(),f);
return z;
}
double calc(double n, double k){
return n*n+k*k;
}
int main(int argc, char *argv[])
{
double (*fun)(double,double) = [](double n, double k){return n*n+k*k;};
std::vector<double> x(5,3);
std::vector<double> y(5,4);
std::vector<double> z1 = calculate<&calc>(x,y);//it works fine
std::vector<double> z2 = calculate<fun>(x,y);//this line gives a bunch of errors
for(int i=0;i<z1.size();i++){
std::cout<<z1[i]<<" ";
}
for(int i=0;i<z2.size();i++){
std::cout<<z2[i]<<" ";
}
return 0;
}
这是错误:
the value of 'fun' is not usable in a constant expression
no matching function for call to 'calculate(std::vector<double>&, std::vector<double>&)
'fun' is not a valid template argument for type 'double (*)(double, double)'
it must be the address of a function with external linkage
答案 0 :(得分:2)
calc
是常量,可以用作模板参数,而fun
是变量,因此不能。
不幸的是,你不能直接将lambda作为模板参数传递,因为你不能(标准说你不能)...所以以下不将起作用:
calculate<[](double n, double k){ return n*n+k*k; }>(x, y);
在特定情况下,不清楚为什么函数是模板参数而不仅仅是参数...(在这种情况下,传递fun
会正常工作)。
答案 1 :(得分:0)
如果他们重新constexpr
,您只能将指针传递给函数作为模板参数。
但是在这种情况下:
double (*fun)(double,double) = [](double n, double k){return n*n+k*k;};
fun
不是,因此您无法将其作为模板参数传递。
简单来说,fun
是运行时变量,您无法将运行时变量作为模板参数传递。