此示例显示如何使用变差模板来计算平方距离。不幸的是,如果我想计算欧氏距离,这将不适用于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上直播
顺便说一句,你计算的是(平方)范数,而不是距离,因为距离(通常)是范数的差。