Подтвердить что ты не робот

Какая связь между шаблоном С++ и набором уток?

Для меня шаблон С++ использовал идею утиной печати, верно ли это? Означает ли это, что все типовые типы, на которые ссылаются в классе или методе шаблона, являются утиным типом?

4b9b3361

Ответ 1

Для меня шаблон С++ использовал идею утиного ввода текста, верно ли это?

Нет, шаблоны С++ используются для реализации общего кода. То есть, если у вас есть код, который может работать с несколькими типами, вам не нужно дублировать его для каждого типа. Такие вещи, как std::vector и std::list, являются очевидными примерами этого в действии. Шаблоны С++ подвергались злоупотреблениям в других целях, но оригинальность была оригинальной.

Означает ли это все общие типы, на которые ссылается класс или метод шаблона тип утки?

Нет, они просто "нормальные" типы, как и любой другой тип на С++. Они просто не известны, пока шаблон не будет создан.

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

template<class InputIterator, class OutputIterator>
    OutputIterator copy(InputIterator first, InputIterator last,
                        OutputIterator result)
{
    while (first!=last) *result++ = *first++;
    return result;
}

Обратите внимание, что функция copy может принимать аргументы любого типа, так же как она реализует оператор неравенства, оператор разыменования и оператор приращения постфикса. Это, вероятно, так же близко к утиной печати, как вы попадете на С++.

Ответ 2

Для меня шаблоны С++ - это компиляторная версия утиного ввода. Компилятор будет компилировать, например. Класс и до тех пор, пока ваша утка имеет все необходимые типы, он будет создавать экземпляр класса.

Если что-то неверно (например, отсутствует конструктор копирования), компиляция завершается с ошибкой. Совпадение в реальном утиппинге является сбоем, когда вы вызываете функцию с помощью не-утиный тип. И здесь это произойдет во время выполнения.

Ответ 3

Утиная набивка означает "если она трясет как утку и ходит как утка, то это утка". У нас нет формального определения в компьютерной науке для сравнения С++ с.

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

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

Одно из отличий заключается в том, что в С++, если аргумент не свернут, то объекты компилятора. В Python только объекты времени выполнения (и только если функция фактически вызывается, если в коде есть условные обозначения). Это различие в характере интерфейса, требуемого для объекта/типа - на С++ либо шаблон требует, чтобы какое-то конкретное выражение было действительным, либо оно не требовало этого. В Python необходимые допустимые выражения могут зависеть от значений времени выполнения ранее необходимых выражений. Таким образом, на Python вы можете попросить объект, который либо громко, либо тихонько, или, если он громко ругается, ему тоже нужно ходить. В С++ вы можете сделать это с помощью условного dynamic_cast, и если том является константой времени компиляции, вы можете сделать это с помощью специализированных шаблонов, но вы не можете использовать статическую типизацию, чтобы сказать, что утке нужно только ходить, если quack_volume() возвращает loud. И, конечно же, в Python требуемый интерфейс не может быть "обязательным" - поведение, если метод отсутствует, - это исключение, и, возможно, возможно будет документировать и гарантировать поведение вызывающего абонента.

До вас ли вы определяете "утиную печать", чтобы это различие означало, что С++ не имеет этого.

Ответ 4

Не совсем. Типы уток (тип динамического типа) никогда не будут давать ошибки типа компиляции, потому что у них просто нет типа. С шаблонами у вас нет типов, пока вы не создадите экземпляр шаблона. Как только вы это сделаете, переменные имеют разные типы, и вы действительно получите ошибки времени компиляции.

Кроме того, с типами уток вы можете иметь одну переменную точку для разных типов объектов, потому что переменные просто не имеют типов. Это невозможно с шаблонами - как только вы их создаете, переменные имеют один конкретный тип.

Они похожи, однако, в том, что ограничения неявные: проверяются только используемые функции. В отличие от, например, полиморфных указателей, фактический тип не имеет значения.

Ответ 5

Да, вроде - например, если тип X имеет методы AddRef(), Release() и QueryInterface() с соответствующими сигнатурами, он может использоваться как COM-объект с классом шаблона CComPtr. Но это не полная утиная типизация - проверка по-прежнему выполняется для параметров.

Ответ 6

Нет, это другое понятие. duck typing - это метод определения типа динамически типизированного контейнера. Шаблоны С++ не являются динамически типизированными, они получают экземпляр определенного типа.