🕵️
Введение в паттерны
  • Введение в паттерны
  • Паттерны
    • Оглавление
    • Порождающие паттерны
      • Фабричный метод
        • Реализации на С++
        • Реализации на 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
  • Назначение
  • Решаемые задачи
  • Различные методы реализации "Стирания типа"

Was this helpful?

  1. Идиомы

Type erasure

Стирание типа

Назначение

Идиома type erasure позволяет работать с объектами разных типов, скрывая их реальный тип при помощи абстрактного интерфейса.

"Стирание типа" позволяет описать общую концепцию, которую могут реализовывать объекты различных типов, при этом скрывая от пользователя конкретный тип объекта.

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

  • необходимость работать с объектами разных типов, но при этом обеспечить единый интерфейс и скрыть от пользователя реальный тип объекта

C++ - это статически типизированный язык. В языках со статической типизацией тип объекта известен и устанавливается во время компиляции. В то время как в языках с динамической типизацией тип связан со значениями времени выполнения. Механизм, осуществляемый идиомой type erasure позволяет преодолеть это ограничение и предоставляет возможность реализовать функции, существующие в языках с динамической типизацией.

Различные методы реализации "Стирания типа"

Стирание типа, используя void*

void qsort (void* base, size_t num, size_t size, 
            int (*compare)(const void*,const void*));

Недостаток: небезопасно и для каждого типа требуется отдельная функция сравнения

Стирание типа с использованием шаблонов C++

template <class RandomAccessIterator>
void sort(RandomAccessIterator first, RandomAccessIterator last);

Недостаток: может привести к появлению множества экземпляров шаблона функции и увеличению времени компиляции

Стирание типа с использованием полиморфизма

struct base 
{ 
    virtual void method() = 0; 
};
struct derived_1 : base 
{ 
    void method() 
    { 
        cout << "derived_1\n"; 
    } 
};
struct derived_2 : base 
{ 
    void method() 
    { 
        cout << "derived_2\n"; 
    } 
};
void call(const base& l) 
{ 
    l.method(); 
};

Недостаток: затраты времени выполнения

Стирание типа с помощью объединения

struct Data {};

union U 
{
    Data d; 
    std::int32_t n; 
    char c; 
    ~U() {} 
}; 

Недостаток: не является типобезопасным

PreviousRAIINextКонтейнеры с type erasure

Last updated 1 year ago

Was this helpful?