gpt4 book ai didi

c++ - 有什么方法可以为函数指定一个通用参数,并限制它应该实现给定的接口(interface)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:59 27 4
gpt4 key购买 nike

例子:

我有一个函数可以处理 vector :

double interpolate2d(const vector<double> & xvals, const vector<double> & yvals, double xv, double yv, const vector<vector<double> > &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);
}

但现在我想用 boost::array 元素调用它的前 2 个参数(与 bracketval() 相同),如果 std::vector 和 boost::array 是自实现的,我将能够派生两者都来自强制执行 operator[] 实现的公共(public)基类(类似接口(interface)),因为两者都是库提供的,是否有任何方法来转换/指定这样的限制?

我总是可以求助于普通的 c 数组,但它不是很整洁。

编辑:FWIW,这里是原始的 bracketval 实现:

void bracketval(const vector<double> &vals, double v, int &hi, int &lo, double &prophi){
hi=vals.size()-1;
lo=0;
while(abs(hi-lo)>1) {
int md = (hi+lo)/2;
if(vals[md]>v) hi=md; else lo=md;
}
if(vals[hi]!=vals[lo])
prophi = (v-vals[lo])/(vals[hi]-vals[lo]);
else
prophi = 0.5;

}

最佳答案

这适用于 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);
}
}

如果您设想第二个 vector 可能是与第一个 vector 不同类型的可能性(例如,第一个是 vector ,第二个是 boost::array),您甚至可以添加一个额外的模板参数:

template <class VecX, class VecY, class VecOfVecs>
double interpolate2d(VecX const & xvals, VecY const & yvals,
double xv, double yv,
VecOfVecs const & fvals)

关于c++ - 有什么方法可以为函数指定一个通用参数,并限制它应该实现给定的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2237100/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com