我有一个函数来计算在一组相邻点上定义的不同变量的梯度。算法总是相同的,但是根据计算的内容,访问邻居的不同成员数据,例如,当计算速度梯度时,使用Node::velocity
,当计算应力梯度时,使用Node::stress
。避免多次编写相同函数的最佳方法是什么?
我想到了几种可能性:
传递 lambda 函数 (c++0x) 或返回有问题的特定成员数据的可调用对象,称为
gradVelocity=computeGradient(listOfNeighbors,[](const Node& n){ return n.velocity; });
减号是每次读取时的额外函数调用。
基于整数的模板函数说明正在计算的内容:
enum{VAL_VELOCITY=0,VAL_STRESS,VAL_SOMETHING}; template<int what> computeGradient(const std::list<Node>& neighbors){ /*loop over neighbors*/ value=(what==VAL_VELOCITY?neighbor.velocity:((what==VAL_STRESS)?neighbor.stress:neighbor.something); /* and so on */ } /* called like this */ gradVelocity=computeGradient<VAL_VELOCITY>(neighbors);
它应该是高效的(希望编译器会在单个实例化中优化条件,去掉常量),但可读性和可维护性非常低。
有更好的主意吗?