Почему C++ говорит, что он реализует нечто, внешне похожее на параметризованный полиморфизм? В частности, не являются ли шаблоны примером полного параметрического полиморфизма?
Шаблонные функции в C++ работают на основе «замены» параметра. Что по существу означает, что компилятор генерирует еще одну версию функции, где аргументы шаблона жестко закодированы в функции.
Предположим, у вас есть это в C++:
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
int i = add(2, 3);
double d = add(2.7, 3.8);
return i + (int)d;
}
Во время компиляции, что приведет к двум функциям: int add(int a, int b) { return a + b; }
и double add(double a, double b) { return a + b; }
Одна функция будет обрабатывать только Интс, а другой будет обрабатывать только двойники. Полиморфизм не существует.
Итак, вы получаете столько реализаций, сколько количество вариантов аргументов.
«Но почему это не параметрический полиморфизм?« вы могли бы спросить?
Вам нужен полный исходный код функции «добавить», чтобы вызвать его с помощью вашего собственного варианта изменения чего-то, что перегружает двоичный оператор «+»! - Это деталь, которая делает разницу.
Если у C++ был правильный параметрический полиморфизм, например C#, ваша окончательная скомпилированная реализация «add» будет содержать достаточно логики, чтобы определить во время выполнения, что «+» перегрузка будет для любого заданного параметра, приемлемого для «добавления». И вам не нужен исходный код для этой функции, чтобы называть его новыми типами, которые вы изобрели.
Что это означает на самом деле?
Но не понимайте это, как если бы C++ был менее мощным или C# был более мощным. Это просто одна из многих особенностей языка.
Если у вас есть полный источник, доступный для ваших шаблонных функций, то семантика C++ намного выше. Если в вашем распоряжении только статическая или динамическая библиотека, то параметрическая полиморфная реализация (например, C#) является превосходной.
Независимо от ответа на этот вопрос, эта страница википедии нуждается в большой любви ... – Barry
Эта страница wiki исходит с теоретической точки зрения - строгая математическая спецификация теории типов и, следовательно, термин «параметрический полиморфизм «имеет строгое определение. Шаблоны C++ более ... гибкие ... чем любая такая теория могла бы/могла бы обеспечить. И таким образом ... возможно, более полезно! Конечно, гораздо больше _интересности! Во всяком случае, я всегда слышал шаблоны C++, описанные как «ad hoc polymorphism». – davidbak