使用函数重载的方法,分别针对整数坐标和实数坐标定义两个函数,求空间内某点到原点的距离。要求无论是一维、二维,还是三维直角坐标空间内的一点

使用函数重载的方法,分别针对整数坐标和实数坐标定义两个函数,求空间内某点到原点的距离。要求无论是一维、二维,还是三维直角坐标空间内的一点,都可以通过调用这两
个函数得出它们到原点的距离。并在此基础上,求平面上点(1.5,-1.5)到原点的距离,以及三维点(1,1,1)到原点的距离。

#include <iostream>
#include <cmath>
#include <type_traits>

template <typename T>
T distance(T a, T b)
{
    return std::abs(a - b);
}

template <typename T, int N>
double distance(const T (&a)[N], const T (&b)[N])
{
    T sum = 0;
    for (int i = 0; i < N; i++)
    {
        auto d = std::abs(a[i] - b[i]);
        sum += d * d;
    }
    return std::sqrt(sum);
}

template <typename T, int N>
typename std::enable_if<!std::is_same<
                            typename std::remove_cv<T>::type, char>::value,
                        std::ostream &>::type
operator<<(std::ostream &os, const T (&a)[N])
{
    os << '(';
    for (int i = 0; i < N; i++)
    {
        os << a[i];
        if (i < N - 1)
            os << ',';
    }
    os << ')';
    return os;
}

int main()
{
    double a1[] = {0.0, 0.0}, b1[] = {1.5, -1.5};
    int a2[] = {0, 0, 0}, b2[] = {1, 1, 1};
    std::cout << "distance(" << a1 << "," << b1 << ")=" << distance(a1, b1) << std::endl;
    std::cout << "distance(" << a2 << "," << b2 << ")=" << distance(a2, b2) << std::endl;
    return 0;
}
$ g++ -Wall main.cpp
$ ./a.out
distance((0,0),(1.5,-1.5))=2.12132
distance((0,0,0),(1,1,1))=1.73205