Перегрузка троичного оператора сравнения

Как реализовать троичный оператор сравнения, чтобы определить, например, логическое значениеa < b < c?

 Mooing Duck14 июн. 2012 г., 00:58
@Drise: так что ответ на его вопросyesно у тебя все равно было разрешение: D
 Pavel Strakhov14 июн. 2012 г., 00:56
Я думаю, что это будет более читабельным в C ++, чтобы написать что-то вродеRange(a, c).contains(b).
 ildjarn14 июн. 2012 г., 00:56
Э-э, вы разместили этот вопрос только для того, чтобы вы могли опубликовать чужой ответ?
 Oliver Charlesworth14 июн. 2012 г., 02:14
Не делай этого. Это абсолютно не имеет смысла, и поэтому может сбить с толку любого, кто читает ваш код. Основное правило с перегрузками операторов:always do as the primitives do.
 Drise14 июн. 2012 г., 00:57
@ildjarn Да, однако это было опубликовано в Lounge & lt; C ++ & gt; и я попросил разрешения разместить его на главном сайте.

Ответы на вопрос(2)

Решение Вопроса

При кодировании сравнения тип возвращаемого значения должен бытьcomparison объект, который может связывать дополнительные сравнения, но неявно преобразуемый вbool, Это может даже (отчасти) работать с типами, которые не были закодированы с этим намерением, просто приведя их кcomparison введите вручную.

Реализация:

template<class T>
class comparison {
  const bool result;
  const T& last;
public:
  comparison(const T& l, bool r=true) :result(r), last(l) {}
  operator bool() const {return result;}
  comparison operator<(const T& rhs) const {return comparison(rhs, (result && last<rhs));}
  comparison operator<=(const T& rhs) const {return comparison(rhs, (result && last<=rhs));}
  comparison operator>(const T& rhs) const {return comparison(rhs, (result && last>rhs));}
  comparison operator>=(const T& rhs) const {return comparison(rhs, (result && last>=rhs));}
};

Полезный пример:

#include <iostream>
int main() {
  //testing of chained comparisons with int
  std::cout << (comparison<int>(0) < 1 < 2) << '\n';
  std::cout << (comparison<int>(0) < 1 > 2) << '\n';
  std::cout << (comparison<int>(0) > 1 < 2) << '\n';
  std::cout << (comparison<int>(0) > 1 > 2) << '\n';
}

Выход:

1
0
0
0

Примечание: это было созданоМытье уткаи скомпилированный, более надежный пример можно найти наhttp://ideone.com/awrmK

 14 июн. 2012 г., 01:01
Теперь, когда вы "ответили", можно ли это сделать? "," Следует ли это сделать? " оставлено в качестве упражнения для читателя.

inline bool RangeCheck(int a, int b, int c)
{
  return a < b && b < c;
}

или же:

#define RANGE_CHECK(a, b, c) (((a) < (b)) && ((b) < (c)))
 14 июн. 2012 г., 01:06
@msw Вот почему я поставил встроенную функцию первой :)
 14 июн. 2012 г., 01:09
+1 за копирование
 14 июн. 2012 г., 02:34
@RadekSlupik: Правда, он не работает с такими выражениями, но, с другой стороны, это выражение неоднозначно. Во-первых, это не имеет смысла.
 14 июн. 2012 г., 01:04
Эта функция не будет работать с более сложными сравнениями, такими какa < b > c > d < e <= f.
 14 июн. 2012 г., 01:05
Я хотел это отозвать, но потом увидел злоупотребление препроцессором (где большинство#define считается вредным в этом веке)

Ваш ответ на вопрос