通过带有可变参数列表的函数计算欧氏距离



此示例显示如何使用变差模板来计算平方距离。不幸的是,如果我想计算欧氏距离,这将不适用于sqrt()。如何用可变数量的函数参数计算欧氏距离。

    /*
     * Calculated the euclidian distance of the obtained parameter list
     */
    template<class T>
    T squared_distance(const T &val) {
        static_assert(std::is_floating_point<T>::value || std::is_integral<T>::value, 
            "ERROR - squared_distance(): template parameter not of type integer or floatn");
        return std::pow(val, 2);
    }
    template<class T, class... Params> 
    T squared_distance(const T &first, const Params&... parameters) {
        return std::pow(first, 2) + squared_distance(parameters...);
    }

以下代码运行良好:

#include <cmath>
#include <iostream>
/*
 * Calculated the euclidian distance of the obtained parameter list
*/
template<class T>
T squared_distance(const T &val) {
    static_assert(std::is_floating_point<T>::value || std::is_integral<T>::value,
                  "ERROR - squared_distance(): template parameter not of type integer or floatn");
    return std::pow(val, 2);
}
template<class T, class... Params>
T squared_distance(const T &first, const Params&... parameters) {
    return std::pow(first, 2) + squared_distance(parameters...);
}
template<class... Params>
double euclidian_distance(const Params&... parameters)
{
    return std::sqrt(squared_distance(parameters...));
}
int main()
{
    std::cout << euclidian_distance(1, 1, 1);
}

在Coliru上直播

顺便说一句,你计算的是(平方)范数,而不是距离,因为距离(通常)是范数的差。

最新更新