2016-04-29 2 views
10

Согласно странице Википедии для Parametric Polymorphism:Почему C++ говорит, что он не поддерживает параметрический полиморфизм?

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

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

+0

Независимо от ответа на этот вопрос, эта страница википедии нуждается в большой любви ... – Barry

+1

Эта страница wiki исходит с теоретической точки зрения - строгая математическая спецификация теории типов и, следовательно, термин «параметрический полиморфизм «имеет строгое определение. Шаблоны C++ более ... гибкие ... чем любая такая теория могла бы/могла бы обеспечить. И таким образом ... возможно, более полезно! Конечно, гораздо больше _интересности! Во всяком случае, я всегда слышал шаблоны C++, описанные как «ad hoc polymorphism». – davidbak

ответ

1

Почему 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#) является превосходной.

1

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

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

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

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

Смежные вопросы