Я имею в виду, помимо его обязательного имени (Стандартная библиотека шаблонов)...
С++ изначально предназначался для представления концепций ООП на C. То есть: вы могли бы сказать, что конкретный объект мог и не мог сделать (независимо от того, как он это работает) на основе его иерархии классов и классов. Некоторые композиции способностей сложнее описать таким образом из-за проблемности множественного наследования и того факта, что С++ поддерживает концепцию интерфейсов несколько неуклюжим способом (по сравнению с java и т.д.), Но там (и может быть улучшенный).
И затем в игру вошли шаблоны вместе с STL. STL, казалось, принял классические концепции ООП и сбросил их вниз, используя вместо этого шаблоны.
Должно существовать различие между случаями, когда шаблоны используются для обобщения типов, где типы тем не имеют значения для работы шаблона (контейнеры, например). Наличие vector<int>
имеет смысл.
Однако во многих других случаях (итераторы и алгоритмы) шаблонные типы должны следовать "концепции" (Input Iterator, Forward Iterator и т.д.), где фактические детали концепции полностью определяются реализацией функции/класса шаблона, а не классом типа, используемого с шаблоном, что несколько противоречит использованию ООП.
Например, вы можете указать функцию:
void MyFunc(ForwardIterator<...> *I);
Обновление: Как было непонятно в исходном вопросе, ForwardIterator в порядке, чтобы сам шаблон был настроен для использования любого типа ForwardIterator. Наоборот, ForwardIterator является концепцией.
ожидает Forward Iterator, только взглянув на его определение, где вам нужно либо посмотреть на реализацию, либо на документацию для:
template <typename Type> void MyFunc(Type *I);
Две претензии, которые я могу сделать в пользу использования шаблонов: скомпилированный код можно сделать более эффективным, путем компиляции шаблона для каждого используемого типа, вместо использования vtables. И тот факт, что шаблоны могут использоваться с родными типами.
Однако я ищу более глубокую причину отказа от классического ООП в пользу шаблонов для STL? (Предполагая, что вы читаете так далеко: P)