Почему C ++ не поддерживает параметрический полиморфизм?

Согласно странице википедии для Параметрический Полиморфизм:

Некоторые реализации полиморфизма типов внешне похожи на параметрический полиморфизм, но также вводят специальные аспекты. Одним из примеров является специализация шаблона C ++.

Вопрос: Почему говорят, что С ++ реализует только нечто внешне похожее на параматеризованный полиморфизм? В частности, разве шаблоны не являются примером полного параметрического полиморфизма?

10

Решение

Почему говорят, что С ++ реализует только нечто внешне похожее на параметризованный полиморфизм? В частности, разве шаблоны не являются примером полного параметрического полиморфизма?

Шаблонные функции в 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; }
Одна функция будет обрабатывать ТОЛЬКО ТОЛЬКО, а другая будет ТОЛЬКО обрабатывать дубли. Нет полиморфизма.

Так что на самом деле у вас столько же реализаций, сколько вариантов аргументов.

«Но почему не этот параметрический полиморфизм?«Вы могли бы спросить?

Вам нужен полный исходный код функции ‘add’, чтобы вызывать ее с вашим собственным конкретным вариантом чего-то, что перегружает бинарный оператор ‘+’! — Это деталь, которая имеет значение.

Если бы C ++ имел надлежащий параметрический полиморфизм, как, например, C #, ваша окончательная скомпилированная реализация ‘add’ содержала бы достаточно логики, чтобы во время выполнения определить, какой будет перегрузка ‘+’ для любого данного параметра, приемлемого для ‘add’. И вам не понадобится исходный код для этой функции, чтобы вызывать ее с новыми придуманными вами типами.

Что это значит на самом деле?

Но не стоит понимать, что C ++ менее мощный или C # более мощный. Это просто одна из многих особенностей языка.

Если у вас есть полный исходный код для шаблонных функций, то семантика C ++ намного лучше. Если у вас есть только статическая или динамическая библиотека, тогда параметрическая полиморфная реализация (например, C #) лучше.

1

Другие решения

Статья, на которую вы ссылаетесь, объясняет это. Тот самый текст, который вы цитировали, на самом деле приводит один пример чего-то, что отличает шаблоны C ++ от чисто параметрического полиморфизма: специализация шаблонов C ++.

Продолжаем на эту тему:

Вслед за Кристофером Стрейчи,[2] параметрический полиморфизм может быть противопоставлен специальный полиморфизм, в которой одна полиморфная функция может иметь несколько различных и потенциально гетерогенных реализаций в зависимости от типа аргумента (ов), к которому она применяется. Таким образом, специальный полиморфизм может, как правило, поддерживать только ограниченное количество таких отдельных типов, поскольку для каждого типа должна быть предусмотрена отдельная реализация.

Таким образом, как описано, шаблоны C ++ приближаются — но не являются точно — параметрическим полиморфизмом.

1

По вопросам рекламы [email protected]