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() {} 
}; 

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

Last updated

Was this helpful?