Зачем было такое требование для разных аргументов одного и того же параметра шаблона?

97
8

На странице 671 его новой книги г-н Страуструп написал следующее предложение:

Обратите внимание, что нет требования, чтобы разные аргументы для одного и того же параметра шаблона были связаны с наследованием.

Я могу понять, что написал автор, но я не могу понять, почему он вставлял этот комментарий в текст. Я думаю, что здесь что-то не хватает, но я точно не знаю.

спросил(а) 2021-01-19T16:15:54+03:00 2 месяца, 3 недели назад
1
Решение
62

Ответ прост, если мы рассмотрим пример использования шаблонов с точки зрения человека, который совершенно не знаком с концепцией шаблонов.

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);

и с помощью разрешения функции перегрузки вызывается правильная функция.

Спасибо за чтение.

Отказ от ответственности: функция печати может быть не лучшим примером.

ответил(а) 2021-01-19T16:15:54+03:00 2 месяца, 3 недели назад
61

Внедряя концепцию шаблонов, он пытается прояснить, что это не какой-то политипизм.

Перед тем как шаблон был изобретен и добавлен в C++, вы могли бы написать общий код только с использованием наследования (или многоуровневого наследования).

Другая концепция, которую г-н Страуструп, конечно же, хочет, чтобы читатель не путался с шаблонами, - это интерфейсы. Например, в java-сообществе это очень популярная техника, и многие книги, написанные ООП, объясняют эту концепцию. Интерфейсы позволяют использовать какой-то общий код с классом при условии, что класс определен для реализации (а не наследования) конкретного интерфейса. Все классы, использующие интерфейс, должны быть связаны с ним. Это не строго говоря наследование, но это своего рода замена на множественное наследование.

Шаблоны могут использоваться с любым объектом или классом, если его тип не связан заранее с чем-либо общим.

ответил(а) 2021-01-19T16:15:54+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема