Я часто это делаю, это некрасиво, но это просто и полезно.
Я часто работаю с контейнерами шаблонов, которые реализуют интерфейс, представить себе что-то вроде
template<class T>
class MyVector : public ContainerInterface
...
Где ContainerInterface имеет основные полезные вещи, но это все. Если мне нужен конкретный алгоритм на векторах целых чисел без представления моей реализации шаблона, полезно принять объекты интерфейса и dynamic_cast в MyVector в реализации. Пример:
// function prototype (public API, in the header file)
void ProcessVector(ContainerInterface& vecIfce);
// function implementation (private, in the .cpp file)
void ProcessVector(ContainerInterface& vecIfce)
{
MyVector<int>& vecInt = dynamic_cast<MyVector<int> >(vecIfce);
// the cast throws bad_cast in case of error but you could use a
// more complex method to choose which low-level implementation
// to use, basically rolling by hand your own polymorphism.
// Process a vector of integers
...
}
Я мог бы добавить метод Process() в ContainerInterface, которые будут полиморфно решены, было бы лучше, метод ООП, но иногда я предпочитаю делать это таким образом. Когда у вас есть простые контейнеры, множество алгоритмов и вы хотите сохранить скрытую реализацию, dynamic_cast предлагает легкое и уродливое решение.
Вы также можете ознакомиться с методами двойной отправки.
НТН
Название этого вопроса не соответствует описанию. – bradtgmurray 2009-07-07 20:06:01