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

use*_*687 2 c++ templates overloading c++11

在c ++ 11中我有函数

double f(double x1);
double f(double x1, double x2);
double f(double x1, double x2, double x3);
double h(double x);
Run Code Online (Sandbox Code Playgroud)

我也有功能

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);
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

是否有一种优雅(模板化)的方式来做这个而不是用重载参数写g 3次?

Yak*_*ont 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;
}
Run Code Online (Sandbox Code Playgroud)

如果你想限制tsdouble超出通话小号f,它需要更多的工作.否则,上面就足够了.

(注意工作安全水准得到与概念C++ 1Y漂亮建兴:在C++ 11余票跳过的限制Ts,以doubles,而仅仅依靠f只服用double秒.)