Почему говорят, что С++ реализует только что-то внешне похожее на параметризованный полиморфизм? В частности, разве шаблоны не являются примером полного параметрического полиморфизма?
Шаблонные функции в 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#, ваша окончательная скомпилированная реализация «добавить» содержала бы достаточно логики, чтобы определить во время выполнения, какой будет перегрузка «+» для любого заданного параметра, приемлемого для «добавления». И вам не понадобится исходный код этой функции, чтобы вызывать ее с помощью новых изобретенных вами типов.
Что это означает на самом деле?
Но не понимайте это так, будто C++ менее мощный или C# более мощный. Это просто одна из многих особенностей языка.
Если у вас есть полный исходный код для ваших шаблонных функций, то семантика C++ намного лучше. Если в вашем распоряжении есть только статическая или динамическая библиотека, лучше использовать параметрическую полиморфную реализацию (например, C#).
person
Zuu
schedule
30.04.2016