🕵️
Введение в паттерны
  • Введение в паттерны
  • Паттерны
    • Оглавление
    • Порождающие паттерны
      • Фабричный метод
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Абстрактная фабрика
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Прототип
        • Реализации на С++
        • Реализации на Kotlin
        • Реализации на Java
        • Возможные реализации для решения конкретных задач на С++
      • Строитель
        • Реализации на С++
        • Реализации на Kotlin
      • Одиночка
        • Реализации на C++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Пул объектов
        • Реализации на С++
    • Структурные паттерны
      • Адаптер
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач
      • Декоратор
        • Реализации на С++
        • Реализации на Kotlin
      • Компоновщик
        • Реализации на С++
      • Мост
        • Реализации на С++
      • Заместитель
        • Реализации на С++
        • Реализации на Kotlin
      • Фасад
        • Реализации на С++
      • Приспособленец
        • Реализации на С++
    • Поведенческие паттерны
      • Стратегия
        • Реализации на С++
        • Реализации на Kotlin
      • Команда
        • Реализации на С++
        • Реализации на Kotlin
      • Цепочка обязанностей
        • Реализации на С++
        • Реализации на Kotlin
      • Подписчик-издатель
        • Реализации на С++
        • Реализации на Kotlin
      • Посетитель
        • Реализации на С++
        • Возможные реализации для решения конкретных задач
      • Посредник
        • Реализации на С++
        • Реализации на Kotlin
      • Шаблонный метод
        • Реализации на С++
      • Опекун
        • Реализации на С++
      • Итератор
        • Реализации на С++
        • Реализации на Kotlin
      • Свойство
        • Реализации на С++
        • Возможные реализации для решения конкретных задач
  • Введение в идиомы
  • Идиомы
    • Оглавление
    • RAII
    • Type erasure
      • Контейнеры с type erasure
    • CRTP
    • Статический полиморфизм
    • Shrink to fit
    • Proxy
    • Erase remove
    • Decltype (auto)
    • Copy and swap
    • Safe bool
    • Scope guard
    • Addressof
Powered by GitBook
On this page
  • Назначение
  • Решаемые задачи
  • Общая реализация на языке C++

Was this helpful?

  1. Идиомы

Safe bool

Назначение

Идиома Safe bool (безопасное преобразование в булево значение) - это подход в программировании, который обеспечивает безопасное преобразование объектов в булево значение. Назначение идиомы состоит в том, чтобы предоставить объектам способность быть использованными в условных операторах при проверке на истинность без явного преобразования в булево значение. Это особенно полезно в контексте условных операторов, где требуется использование объектов, которые не являются простыми булевыми значениями.

Решаемые задачи

  • Проверка корректности объектов с помощью условных операторов

В языке программирования C++ условные операторы, такие как if или while, ожидают, что условие будет иметь булево значение (true или false). Однако в некоторых случаях объекты не могут быть просто преобразованы в булево значение, так как они представляют более сложные состояния или требуют дополнительной логики для определения истинности или ложности. Идиома safe bool помогает решить эту задачу. Вместо использования явного преобразования в булево значение, можно просто проверить объект на истинность с помощью условных операторов.

Общая реализация на языке C++

Идиома может быть реализована несколькими способами:

  1. Перегрузка оператора приведения к типу operator bool().

  2. Перегрузка оператора приведения к типу operator void *().

  3. Перегрузка оператора приведения к логическому типу (basic_ios).

В этом примере перегружен оператор приведения к типу bool, который возвращает true, если значение объекта MyClass не равно нулю, и false в противном случае. Это позволяет использовать объекты MyClass в условиях ветвлений if и while.

class MyClass 
{
public:
    MyClass(int value) : value_(value) { }

    operator bool() const 
    { 
        return value_ != 0; 
    }

private:
    int value_;
};
#include <iostream>

int main() 
{
    MyClass obj1(10);
    MyClass obj2(0);

    if (obj1) 
    {
        std:: cout << "obj1 is true" << std:: endl;
    }
    
    if (!obj2)
    {
        std:: cout << "obj2 is false" << std:: endl;
    }

    return 0;
}

В этом примере перегружен оператор приведения к типу void*, который возвращает указатель на объект MyClass, если значение объекта не равно нулю, и nullptr в противном случае. Это позволяет использовать объекты MyClass в условиях ветвлений if и while, а также при работе с указателями.

class MyClass {
public:
    MyClass(int value) : value_(value) { }

    operator void* () const 
    {
        return value_ != 0 ? this : nullptr;
    }
    
private:
    int value_;
};
#include <iostream>

int main() {
    MyClass obj1(10);
    MyClass obj2(0);

    if (obj1) 
    {
        std:: cout << "obj1 is true" << std:: endl;
    }
    
    if (!obj2) 
    {
        std:: cout << "obj2 is false" << std:: endl;
    }

    return 0;
}

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

struct Testable
{
    explicit operator bool() const 
    { 
        // Обработка
        return false; 
    }
};
int main()
{
    Testable a, b;
    if (a) 
    { 
        // Процесс
    }
    
    return 0;
}
PreviousCopy and swapNextScope guard

Last updated 1 year ago

Was this helpful?