Я собираюсь преобразовать большой набор геопространственного кода из одного проектора в другой. Чтобы обеспечить соблюдение правильных единиц во время этого преобразования, я ввел шаблоны Distance, Point, Rectangle и Polygon, которые берут тег, указывающий, какая система координат используется. Это работает довольно хорошо, но есть много мест, где проверки выполняются для ненулевого (!= 0
) или положительных значений (> 0
). Я хотел бы иметь возможность перегрузить эти операторы, чтобы сравнить их с 0
без сравнения с другими номерами. Можно ли это сделать?Сравнение перегрузки для конкретных интегральных констант
В качестве дополнительного ограничения, я не могу использовать constexpr
, потому что я должен поддерживать VS 2013, но я все еще будет интересно узнать, есть ли способ сделать это с constexpr
Просто для справки, я работаю с чем-то вроде этого:
template<typename Tag> struct Distance
{
int value;
};
template<typename Tag> struct Point
{
Distance<Tag> x;
Distance<Tag> y;
};
// This works fine for comparing two Distances
template<typename Tag> bool operator>(const Distance<Tag>& a, const Distance<Tag>& b) {return a.value > b.value;}
// But I don't want this to allow a > 14, only a > 0
template<typename Tag> bool operator>(const Distance<Tag>& a, int b) {return a.value > b;}
struct Mercator;
typedef Point<Mercator> MercPoint;
struct GuiScale;
typedef Point<GuiScale> GuiPoint;
// etc.
Почему не имеют BOOL функции, такие как 'IsZero'? На мой взгляд, перегрузка математических операторов, которые принимают только одно допустимое значение, - плохая идея. –
В чем смысл шаблона класса «Расстояние»? – P0W
@ P0W, поэтому вы не можете дать два несвязанных расстояния 'operator>' (или другую функцию) и дать целочисленному типу имя, соответствующее его использованию. – chris