В зависимости от того, что вы делаете, может быть выбрано удаление типа. О напряжении между объектно-ориентированным и общим программированием в C ++ - моя любимая статья по этому вопросу.
В двух словах, вы преобразуете статическую диспетчеризацию, разрешенную шаблонами, в динамическую диспетчеризацию.через пользовательское дерево наследования, которое вы настраиваете на лету.Вместо хранения A<T>
вы создаете новый тип, имеющий желаемый общий интерфейс, и с помощью некоторого шаблона / наследования voodoo этот новый тип хранит A<T>
без фактического раскрытия T
.Так что A<int>
и A<double>
и A<A<std::list<A<int> > > >
и some_type_that_looks_like_A_but_really_isnt
- все сводятся к одному типу.
Но у вас должен быть общий интерфейс, независимый от этого параметра.Если вы не можете, все становится сложнее.
Boost.Any является хорошим примером, как и std::shared_ptr
[, который использует стирание типа, чтобы запомнить, как удалить указатель, переданный вэто даже перед лицом неполиморфного наследования].