Это работает с std :: vector, boost :: array, встроенными массивами, как правило, со всем, что индексируется. Я также включил предложение о том, как вам следует реализовать функцию bracketval
:
template<class Vec>
void bracketval(Vec const & xvals, double xv, int xhi, int xlo, double xphi)
{
}
template <class Vec, class VecOfVecs>
double interpolate2d(Vec const & xvals, Vec const & yvals,
double xv, double yv,
VecOfVecs const & fvals)
{
int xhi, xlo, yhi, ylo;
double xphi, yphi;
bracketval(xvals,xv,xhi,xlo,xphi);
bracketval(yvals,yv,yhi,ylo,yphi);
return (fvals[xhi][yhi]*xphi+fvals[xlo][yhi]*(1.-xphi))
*yphi + (fvals[xhi][ylo]*xphi+fvals[xlo][ylo]
*(1.-xphi))*(1.-yphi);
}
int main()
{
{
std::vector<double> v, w;
std::vector<std::vector<double> > vv;
interpolate2d(v, w, 1., 2., vv);
}
{
boost::array<double, 4> v, w;
boost::array<boost::array<double, 4>, 4> vv;
interpolate2d(v, w, 1., 2., vv);
}
{
double v[4], w[4];
double vv[4][4];
interpolate2d(v, w, 1., 2., vv);
}
}
Вы даже можете добавить дополнительный параметр шаблона, если предполагаете, что второй вектор может быть другого типа, чем первый (например, первый вектор и второй boost :: array):
template <class VecX, class VecY, class VecOfVecs>
double interpolate2d(VecX const & xvals, VecY const & yvals,
double xv, double yv,
VecOfVecs const & fvals)