Есть ли какой-либо метод или макрос для симуляции синтаксиса "if (a <= b <c <=...)" заменить "if (a <= b && b <c && c <=...)"?

49
5

Я хочу найти метод или макрос, который a <= b && b < c может переписать как a <= b < c, потому что a <= b < c выглядит более прямолинейным и часто рассматривается в определении требований пользователя. Кроме того, a <= b && b < c необходимо ввести b дважды.

Я искал информацию о операторах, но кажется (я думаю) только добавить операцию для пользовательского класса, но не изменить исходную операцию. Также я знаю, что могу перегрузить bool operator > но не уверен, что могу добавить новый int operator > операции int operator > который возвращает более крупный. Кроме того, даже операция перегрузки работает, a <= b < c вернет только c, но не true или false оператора a <= b < c (аналогично MAX(c, MAX(b, a))).

Есть ли какой-нибудь метод для моделирования a <= b < c <=...?

спросил(а) 2015-06-10T09:06:00+03:00 4 года, 8 месяцев назад
1
Решение
98

Комментарии уже отмечают, что это плохая идея, поэтому я не буду повторять это.

Это несколько возможно с макросами. Ни один из этих операторов не может быть именем макроса. Но если вы позволите BADIDEA(a<=b<c), вы можете развернуть это как HelperClass()*a<=b<c. Идея заключается в том, что Helperclass::operator* имеет самую высокую точность. Это означает, что мы анализируем его как HelperClass::operator*(HelperClass(), a).

Эта первая часть возвращает другой HelperClass. HelperClass также перегружает operator<= поэтому мы получаем HelperClass::operator<=(firstExpr, b).

Таким образом, мы можем построить список аргументов, переданных в HelperClass Он поддерживает BADIDEA(a<b<c<d). В итоге мы просто вызываем HelperClass::operator bool который возвращает true тогда и только тогда, когда отсортирован список аргументов.

Альтернативно, вам не нужно создавать список аргументов, но можете сразу их оценить. HelperClass()*4<3 уже может оценивать значение false до того, как вы увидите <=7 в HelperClass()*4<3<=7

ответил(а) 2015-06-10T10:26:00+03:00 4 года, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема