我不想复制我的代码,但我有2个功能,除1行外,它们都是相同的。 我确实需要单独的函数来调用私有函数,这可能是一个模板,并将解决我的重复代码问题。
double EuclideanDistance::calculateDistance(const Point &p1, const Point &p2) const
{
if (p1.getDimension()!=p2.getDimension())
return 0;
double sum = 0.0;
for( size_t i = 0; i < p1.getDimension(); i++)
{
sum += pow( p1[i] - p2[i], 2.0);
}
return sqrt(sum);
}
double EuclideanDistance::calculateWeightedDistance(const Point &p1, const Point &p2, const double *weights) const
{
if (p1.getDimension()!=p2.getDimension())
return 0;
double sum = 0.0;
for( size_t i = 0; i < p1.getDimension(); i++)
{
sum += pow( ((p1[i] - p2[i])*weights[i]), 2.0);//here is the difference
}
return sqrt(sum);
}
你有什么建议吗?
答案 0 :(得分:5)
完全实施calculateWeightedDistance
。
以及calculateDistance
致电calculateWeightedDistance
,重量为1.0
答案 1 :(得分:2)
以下怎么样?
如果使用第三个参数nullptr
调用该函数,则执行第一个版本的行为。
double EuclideanDistance::calculateWeightedDistance(const Point& p1, const Point& p2, const double* weights) const {
if (p1.getDimension()!=p2.getDimension())
return 0;
double sum = 0.0;
for( size_t i = 0; i < p1.getDimension(); i++)
{
const auto distance_d = (p1[i] - p2[i]) *
(weights != nullptr ? weights[i] : 1.0);
sum += pow(distance_d, 2.0);
}
return sqrt(sum);
}
答案 2 :(得分:1)
你可以这样分解:
template <typename F, typename Ts...>
double calculateDistanceImpl(F&& f, const Point &p1, const Point &p2, Ts&&... args)
{
if (p1.getDimension()!=p2.getDimension())
return 0;
double sum = 0.0;
for( size_t i = 0; i != p1.getDimension(); i++)
{
sum += f(p1[i], p2[i], args[i]...);
}
return sqrt(sum);
}
double EuclideanDistance::calculateDistance(const Point &p1, const Point &p2) const
{
return calculateDistanceImpl(
[](auto&& p1, auto&& p2){ return pow(p1 - p2, 2.0);},
p1, p2);
}
double EuclideanDistance::calculateWeightedDistance(const Point &p1,
const Point &p2,
const double *weights) const
{
return calculateDistanceImpl(
[](auto&& p1, auto&& p2, double weight){ return pow((p1 - p2) * weight, 2);},
p1, p2, weights);
}