在c ++ 11中我有函数
double f(double x1);
double f(double x1, double x2);
double f(double x1, double x2, double x3);
double h(double x);
我也有功能
double g(std::vector<double> y, double x1);
double g(std::vector<double> y, double x1, double x2);
double g(std::vector<double> y, double x1, double x2, double x3);
g的实现类似于
double g(std::vector<double> y, double x1, double x2, double x3)
{
double ans = 0.0;
for(g : y)
{
ans = h(g) * f(x1, x2, x3);
}
return ans;
}
是否有一种优雅(模板化)的方法,而不是用重载参数写g 3次?
答案 0 :(得分:10)
template<typename... Ts>
double g(std::vector<double> v, Ts&&...ts ) {
double ret = 1;
for(auto x:v){
ret *= h(x)*f(ts...);
}
return ret;
}
如果您想将ts
限制为double
,而不是调用f
,则需要更多工作。否则,上述就足够了。
(注意在c ++ 1y中,resction工作变得更漂亮了:在C ++ 11中,我投票跳过Ts
到double
的限制,只依靠{{ 1}}只接受f
s。)