ilyachalov (ilyachalov) wrote,
ilyachalov
ilyachalov

Categories:

Идиома Safe Bool

В языках программирования существуют идиомы (вики) — устоявшиеся способы решения каких-то часто встречающихся задач.

Не следует путать идиомы в программировании с идиомами в языках, на которых общаются люди. Идиомы в языках общения (вики) — это устоявшиеся фразы, значение которых не вытекает напрямую из значений составляющих эти фразы слов. Например, «зарубить на носу», «взять себя в руки», «белая ворона» и тому подобные.

Кстати, есть целая книжка на английском языке, в которой собрано множество идиом C++, она называется «More C++ Idioms» и доступна бесплатно на условиях GNU FDL (лицензия свободной документации):
https://en.wikibooks.org/wiki/More_C++_Idioms

Что такое идиома Safe Bool? Многие программисты, создавая программы на языке C++, хотели иметь возможность проверять объекты написанных ими классов на корректность с помощью похожей на следующую конструкции:
if (объект)
    { /* проверка пройдена успешно, используем объект */ }
else
    { /* проверка не пройдена, сообщаем об ошибке, завершаем программу */ }
В данном случае говорят, что объект написанного нами класса оказался в «boolean context» (по-русски «булевском контексте» или «булевом контексте» или «контексте логического типа»), то есть в контексте, в котором требуется преобразование объекта написанного нами класса в значение булевского (логического) типа.

Требуемое преобразование программисты обычно пытались обеспечить разными способами. Например, с помощью перегрузки (переопределения) оператора приведения к логическому типу operator bool() или оператора приведения к типу void*operator void*(). Однако, все способы имели побочные эффекты и в среде программистов постоянно продолжался поиск этакого философского камня — идиомы Safe Bool. Слово «safe» («безопасный») здесь означает отсутствие в искомом решении побочных эффектов; решение должно было быть безопасным, то есть свободным от ошибок.

Хорошую статью, посвященную поиску идиомы Safe Bool, написал Бьёрн Карлссон (Bjorn Karlsson). Она была опубликована 31 июля 2004 года под названием «The Safe Bool Idiom»:
https://www.artima.com/cppsource/safebool.html

Глава «Safe Bool» в упомянутой выше книге «More C++ Idioms» написана на основе именно статьи Бьёрна Карлссона:
https://en.wikibooks.org/wiki/More_C++_Idioms/Safe_bool

Стандарт С++. Поиск идиомы Safe Bool можно проследить в стандарте языка C++ на примере потоковых классов. В стандарте C++98 преобразование потока в значение логического типа обеспечивалось с помощью перегрузки оператора приведения к типу void*:
ios::operator void*() const;
Данная функция возвращала нулевой указатель в случае некорректности потока, который в булевском контексте считался за значение false («ложь»). Любой другой указатель, возвращенный данной функцией, в булевском контексте считался за значение true («истина»).

Со стандарта C++11 преобразование потока в значение логического типа обеспечивается с помощью перегрузки оператора приведения к логическому типу (в шаблоне basic_ios):
explicit operator bool() const;
Служебное слово «explicit» означает, что эта функция сработает только при явном вызове преобразования, например: static_cast<bool>(поток). Но в стандарте C++11 оговорено, что данная функция будет срабатывать и в условиях ветвлений if, циклов while и других подобных случаях.

Источники:
https://en.cppreference.com/w/cpp/io/basic_ios/operator_bool
http://www.cplusplus.com/reference/ios/basic_ios/operator_bool/
Tags: Английский язык, Книги, Образование, Программирование, Статьи
Subscribe

Recent Posts from This Journal

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments