А если серьёзно, то иногда приходится писать что-то типа:
if (!(lengthy_cond1
&& lengthy_cond2
&& lengthy_cond3
&& lengthy_cond4))
Но мне лично такая форма не очень нравится, не очень читаемо. Инвертировать все условия тоже не нравится, т.к. 'позитивные' условия обычно легче пишутся и читаются, чем 'негативные' (в смысле, что например "пришедший пакет корректный", а не "пришедший пакет не корректный").
А с unless имхо выглядит лучше:
#define either(c) ( ((x) ? 1 : 0)
#define or(c) ^ ((y) ? 1 : 0) )
if either (x) or (y)
// do something if one and only one of them is trueelse// do something otherwise, i.e. if both are true or both are false
Здравствуйте, remark, Вы писали:
R>Про unless подумалось глядя на Ruby код. Чем мы хуже?
Вот только в перле и руби можно писать "some unless(x)", "some if(x)" а с этим облом здесь.
Здравствуйте, vadimcher, Вы писали:
V>Здравствуйте, remark, Вы писали:
R>>
R>>#define unless(x) if (!(x))
V>[]
V>
V>Вот придумалось еще: V>
V>#define either(c) ( ((x) ? 1 : 0)
V>#define or(c) ^ ((y) ? 1 : 0) )
V>if either (x) or (y)
V> // do something if one and only one of them is true
V>else
V> // do something otherwise, i.e. if both are true or both are false
V>
Про unless подумалось глядя на Ruby код. Чем мы хуже?
Здравствуйте, remark, Вы писали:
R>Про unless подумалось глядя на Ruby код. Чем мы хуже?
Тем, что умнее
R>
Двойное
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Всё можно, но из действительно полезной препроцессорной магии, которая как бы добавляет языковые конструкции, могу вспомнить только countof, BOOST_FOREACH и BOOST_SCOPE_EXIT
Здравствуйте, Alexander G, Вы писали:
AG>Всё можно, но из действительно полезной препроцессорной магии, которая как бы добавляет языковые конструкции, могу вспомнить только countof, BOOST_FOREACH и BOOST_SCOPE_EXIT
Ещё offsetof().
_countof в C++ хорошо реализуется и на шаблонах.
AG>Всё можно, но из действительно полезной препроцессорной магии, которая как бы добавляет языковые конструкции, могу вспомнить только countof, BOOST_FOREACH и BOOST_SCOPE_EXIT
AG>и BOOST_TYPEOF ? Пока обхожусь, он кажется имеет большой компайл-тайм оверхед.
Явно — нет, вроде как пока не требовался. Но BOOST_AUTO в него раскрывается.
AG>Всё можно, но из действительно полезной препроцессорной магии, которая как бы добавляет языковые конструкции, могу вспомнить только countof, BOOST_FOREACH и BOOST_SCOPE_EXIT
Здравствуйте, remark, Вы писали: R>Но мне лично такая форма не очень нравится, не очень читаемо. Инвертировать все условия тоже не нравится, т.к. 'позитивные' условия обычно легче пишутся и читаются, чем 'негативные' (в смысле, что например "пришедший пакет корректный", а не "пришедший пакет не корректный"). R>А с unless имхо выглядит лучше: R>
#include <iso646.h>
...
if ( not (lengthy_cond1
&& lengthy_cond2
&& lengthy_cond3
&& lengthy_cond4))
?
"To protect people you must slay people. To let people live you must let people die. This is the true teaching of the sword."
-Seijuro Hiko, "Rurouni Kensin"