В данном случае мне кажется, что проще привести пример, который обрисует проблему. Итак, предположим, нам необходим список, содержащий функции со следующей сигнатурой:
Окей, скажем мы:
Но, что если мы хотим хранить не только функции, но и объекты у которых есть оператор (), возвращающий int. В таком случае, мы могли бы сделать базовый класс:
Но в таком случае мы ограничены только теми объектами, которые являются наследниками класса nullary_function_base. Как быть с функторами, которые получаются, например, в результате использования std::bind1st и пр.? Ведь в этом случае мы уже не можем сделать его наследником nullary_function_base. Или если используется обобщенное программирование и тип функтора просто неизвестен (например, внутри шаблонного класса, функции)?
Вот как раз для решения такой проблемы и используется type erasure.
typedef int (* nullary_function_returning_int_t)();
|
_Winnie C++ Colorizer |
typedef std::list<nullary_function_returning_int_t> func_list_t;
|
_Winnie C++ Colorizer |
class nullary_function_base
{
public:
virtual ~nullary_function_base(){} virtual int operator() () = 0; }; typedef std::list<nullary_function_base * > func_list_ptr_t; |
_Winnie C++ Colorizer |
Вот как раз для решения такой проблемы и используется type erasure.