Вот что я часто делаю, это не красиво, но просто и полезно.
Я часто работаю с шаблонными контейнерами, которые реализуют интерфейс,
представьте что-то вроде
template<class T>
class MyVector : public ContainerInterface
...
Где ContainerInterface содержит базовые полезные вещи, но это все. Если я хочу конкретный алгоритм для векторов целых чисел, не подвергая мою реализацию шаблона, полезно принять объекты интерфейса и динамически передать его 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 предлагает простое и безобразное решение.
Вы также можете посмотреть на методы двойной отправки.
НТН