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