Зачем было такое требование для разных аргументов одного и того же параметра шаблона?
На странице 671 его новой книги г-н Страуструп написал следующее предложение:
Обратите внимание, что нет требования, чтобы разные аргументы для одного и того же параметра шаблона были связаны с наследованием.
Я могу понять, что написал автор, но я не могу понять, почему он вставлял этот комментарий в текст. Я думаю, что здесь что-то не хватает, но я точно не знаю.
Ответ прост, если мы рассмотрим пример использования шаблонов с точки зрения человека, который совершенно не знаком с концепцией шаблонов.
int i;
double d;
char c;
print(&i); //prints an integer
print(&d); //prints a double
print(&c); //prints a char
С точки зрения человека, который не понимает шаблоны C++, он предположил, что прототип print
выглядит примерно так.
print(SomeBaseType* pdata);
OR
print(void* pdata);
Однако, что происходит с шаблонами, есть шаблон функции, такой как
template <typename T>
print(T* pdata);
для вышеупомянутого варианта использования компилятор генерирует три функции во время компиляции
print(int* pdata);
print(double* pdata);
print(char* pdata);
и с помощью разрешения функции перегрузки вызывается правильная функция.
Спасибо за чтение.
Отказ от ответственности: функция печати может быть не лучшим примером.
Внедряя концепцию шаблонов, он пытается прояснить, что это не какой-то политипизм.
Перед тем как шаблон был изобретен и добавлен в C++, вы могли бы написать общий код только с использованием наследования (или многоуровневого наследования).
Другая концепция, которую г-н Страуструп, конечно же, хочет, чтобы читатель не путался с шаблонами, - это интерфейсы. Например, в java-сообществе это очень популярная техника, и многие книги, написанные ООП, объясняют эту концепцию. Интерфейсы позволяют использовать какой-то общий код с классом при условии, что класс определен для реализации (а не наследования) конкретного интерфейса. Все классы, использующие интерфейс, должны быть связаны с ним. Это не строго говоря наследование, но это своего рода замена на множественное наследование.
Шаблоны могут использоваться с любым объектом или классом, если его тип не связан заранее с чем-либо общим.