优雅的模板重载解决方案?

时间:2013-11-25 21:06:01

标签: c++ templates c++11 overloading

在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次?

1 个答案:

答案 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中,我投票跳过Tsdouble的限制,只依靠{{ 1}}只接受f s。)