message: Cleanups in Euclidean_distance.
diff: #ifndef DISTANCE_FUNCTIONS_H_
  #define DISTANCE_FUNCTIONS_H_
  +#include <gudhi/Debug_utils.h>
  +
  +#include <boost/range/metafunctions.hpp>
  +
  #include <cmath> // for std::sqrt
  #include <type_traits> // for std::decay
  #include <iterator> // for std::begin, std::end
  @@ -38,20 +42,29 @@ namespace Gudhi {
  * have the same dimension. */
  class Euclidean_distance {
  public:
  + // boost::range_value is not SFINAE-friendly so we cannot use it in the return type
  template< typename Point >
  - auto operator()(const Point& p1, const Point& p2) const -> typename std::decay<decltype(*std::begin(p1))>::type {
  - auto it1 = p1.begin();
  - auto it2 = p2.begin();
  - typename Point::value_type dist = 0.;
  - for (; it1 != p1.end(); ++it1, ++it2) {
  - typename Point::value_type tmp = (*it1) - (*it2);
  + typename std::iterator_traits<typename boost::range_iterator<Point>::type>::value_type
  + operator()(const Point& p1, const Point& p2) const {
  + auto it1 = std::begin(p1);
  + auto it2 = std::begin(p2);
  + typedef typename boost::range_value<Point>::type NT;
  + NT dist = 0;
  + for (; it1 != std::end(p1); ++it1, ++it2) {
  + GUDHI_CHECK(it2 != std::end(p2), "inconsistent point dimensions");
  + NT tmp = *it1 - *it2;
  dist += tmp*tmp;
  }
  - return std::sqrt(dist);
  + GUDHI_CHECK(it2 == std::end(p2), "inconsistent point dimensions");
  + using std::sqrt;
  + return sqrt(dist);
  }
  template< typename T >
  - T operator() (const std::pair< T, T >& f, const std::pair< T, T >& s) {
  - return sqrt((f.first-s.first)*(f.first-s.first) + (f.second-s.second)*(f.second-s.second));
  + T operator() (const std::pair< T, T >& f, const std::pair< T, T >& s) const {
  + T dx = f.first - s.first;
  + T dy = f.second - s.second;
  + using std::sqrt;
  + return sqrt(dx*dx + dy*dy);
  }
  };
  