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