Действительно, просто не делай этого. Сделайте это вместо:
template<typename T>
class Point2D
{
bool equals(const Point2D& other, std::true_type is_floating_point ) const;
bool equals(const Point2D& other, std::false_type is_floating_point ) const;
public:
Point2D(T x, T y);
Point2D& operator= (const Point2D& point);
bool operator==(const Point2D& point) const;
bool operator!=(const Point2D& point) const;
};
сейчас:
template<typename T>
bool Point2D<T>::operator==(const Point2D& point) const
{
return this->equals(point, std::is_floating_point<T>{});
}
template<class T>
bool Point2D<T>::equals(const Point2D& point, std::false_type /*is_floating_point*/ ) const {
return (x_ == point.x_) && (y_ == point.y_);
}
template<class T>
bool Point2D<T>::equals(const Point2D& point, std::true_type /*is_floating_point*/ ) const {
return Traits::almost_equal(x_, point.x_) &&
Traits::almost_equal(y_, point.y_);
}
это отправка тегов. Он чище и проще и требует меньше времени для компиляции, чем SFINAE enable-if.