#include <cmath>
    
    template<typename X> class A {
      X a;
    public:
      A(X x) : a(x) {}
      template<typename Y>
      auto diff(A<Y> const&y) const -> decltype(a-y.a)
      { return a-y.a; }
    };
    
    template<typename X, typename Y>
    inline auto dist(A<X> const&x, A<Y> const&y) -> decltype(std::abs(x.diff(y)))
    { return std::abs(x.diff(y)); }
    
    int main()
    {
      A<double> x(2.0), y(4.5);
      return (int) dist(x,y);
    }