За очень немногими исключениями (смотря на вас, температурные шкалы Фаренгейта и Цельсия) единицы линейны, и значение ноль является одновременно аддитивной идентичностью для всех единиц сразу.
Так дано
auto speed = dimensioned(20, _meter/_second);
auto power = dimensioned(75, _watt);
тогда
if (speed < 6) ...
if (power > 17) ...
имеет не больше смысла, чем
if (speed > power) ...
ты должен написать
if (speed < dimensioned(6, _mile/_hour)) ...
Тем не менее, это имеет смысл:
if (speed < 0)
потому что 0 м/с == 0 миль в час == 0 а.е./две недели или любые другие единицы, которые вы хотите использовать (для скорости). Тогда возникает вопрос, как включить это и только это использование.
Явные операторы С++ 11 и контекстное преобразование в bool
избавили от необходимости использовать идиому "safe-bool". Похоже, что эту проблему можно решить с помощью сопоставимой идиомы «безопасный ноль»:
struct X
{
int a;
friend bool operator<(const X& left, const X& right) { return left.a < right.a; }
private:
struct safe_zero_idiom;
public:
friend bool operator<(const X& left, safe_zero_idiom*) { return left.a < 0; }
};
- Демо: http://ideone.com/vUxmxi
К сожалению, кажется, что развернутые библиотеки измерений/юнитов этого не делают. (Этот вопрос возник, потому что я действительно хотел проверить, был ли std::chrono::duration
отрицательным). Это полезно? Есть ли случаи, которые могут привести к сбою? Есть ли более простой способ разрешить сравнение с нулем?
Можно подозревать, что вместо реализации этого для отдельных операторов должно существовать неявное преобразование литерала нуля в типы с единичной меткой.
отмечу, что это позволяет
X{1} < nullptr
как допустимое выражение :(, и, к сожалению, предоставление недоступной перегрузки типа std::nullptr_t
не исправляет это, поскольку стандарт говорит в разделе 4.10
Константа нулевого указателя целочисленного типа может быть преобразована в prvalue типа
std::nullptr_t
.
speed < 6
какой реальный вред в том, чтобы позволить6
использовать те же единицы измерения, что иspeed
, неявно? - person jxh   schedule 26.09.2013speed
изменятся. - person jxh   schedule 26.09.2013nullptr
для указателей. - person Mikhail   schedule 22.09.2016