Новые версии C ++ движутся в направлении статической типизации утки. Вы можете когда-нибудь (сегодня?) Написать что-то вроде этого:
auto plus(auto x, auto y){
return x+y;
}
, и он не сможет скомпилироваться, если нет соответствующего вызова функции для x+y
.
Что касается вашей критики:
Новый CallMyMethod создается для каждого отдельного типа, который вы ему передаете, так что на самом деле это не вывод типа.
Но это вывод типа (можно сказать foo(bar)
, где foo
- шаблонная функция), и имеет тот же эффект, за исключением того, что он более эффективен по времени и занимает больше места в скомпилированном коде.
В противном случае вам придется искать метод во время выполнения. Вам нужно будет найти имя, а затем проверить, что у имени есть метод с правильными параметрами.
Или вам придется хранить всю эту информацию о соответствующих интерфейсах и просматривать каждый класс, соответствующий интерфейсу, а затем автоматически добавлять этот интерфейс.
В любом случае это позволяет вам неявно и случайно нарушать иерархию классов, что плохо для новой функции, поскольку противоречит привычкам программистов на C # / Java. С шаблонами C ++ вы уже знаете, что находитесь на минном поле (и они также добавляют функции («концепции»), чтобы разрешить ограничения параметров шаблона).