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

标签 c++ arrays vector interpolation

例子:

我有一个函数可以处理 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/

相关文章:

java - 如何获得构成通用路径的分段?

c++ - Makefile:从 makefile 运行其他 makefile

java - JNI 初始化函数和缓存类和字段

c# - 从长度为 M 的未排序数组中搜索前 N 个已排序整数?

c++ - 为什么这个 daxpy 在 C++ 中不起作用?

r - 将向量分割成 block ,直到事件发生

c++ - 如何配置 Makefile 以使用 OpenCV

c++ - 在 Qt C++ 项目中使用 Go

c# - 无法在锯齿状数组中声明对象

arrays - 在数组中查找与数组具有相同均值的对