c ++除了一行外,两个函数的作用相同

时间:2017-06-08 11:59:56

标签: c++ templates duplicates

我不想复制我的代码,但我有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);
}
你有什么建议吗?

3 个答案:

答案 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);
}