Иногда делают баги, и забывают написать if на проверку бессмысленности значения. "Бессмысленное" значение вырывается в мир, и начинает участвовать в арифметических операциях или становится "особым" значением уже в другом месте.
Для того что бы явно записать факт "иногда тут ничего нет" используется обёртка над типом, внутри которой хранится булевский флажок. В boost есть тип boost::optional<T>. В Haskell есть Maybe T. В C# есть Nullable (для встроенных типов).
Хороший пример, почему лучше иметь тип в котором особое состояние "нету никакого int вообще": cначала человек получает -1 из системной функции типа getpid, а затем эта -1 попадает в killall. Смерть, разрушения, мертвый мак.
Есть ещё мой велосипед для C++, когда не хочется boost, без вложенных зависимостей:
MayBe<T> : https://github.com/dobrokot/may_be/blob/master/may_be.hpp
Если кто-то сможет помочь переписать с учетом strict aliasing - буду благодарен. Как с учетом strict aliasing вообще разместить объект типа T в массиве char[sizeof(T)] ? Русские коментарии на английские переведу сам, если вдруг окажется что штука нужная и нравится людям больше чем boost::optional :)
Примеры использования: https://github.com/dobrokot/may_be/blob/master/may_be_usage_example.cpp
|
_Winnie C++ Colorizer |