例:
ベクトルで動作する関数があります:
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);
}
しかし、最初の 2 つの引数 (bracketval() と同じ) の boost::array 要素を使用して呼び出したいと思います。 std::vector と boost::array が自己実装されている場合、両方をoperator[] の実装を強制する一般的な基本クラス (インターフェイスのようなもの) は、どちらもライブラリ提供であるため、そのような制限をキャスト/指定する方法はありますか?
私はいつでも単純な c-array に頼ることができますが、あまりきれいではありません。
編集: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;
}