class Poly
{
public static void WriteVal(int i) { System.Console.Write("{0}\n", i); }
public static void WriteVal(string s) { System.Console.Write("{0}\n", s); }
}
class GenWriter<T>
{
public static void Write(T x) { Poly.WriteVal(x); }
}
Почему невинный (для программиста C ++) метод Write недопустим в C #?
Вы можете видеть, что компилятор пытается сопоставить тип параметра T с конкретными перегрузками до instantiation:
Ошибка 3 Наилучшее совпадение перегруженного метода для TestGenericPolyMorph.Poly.WriteVal (int) имеет недопустимые аргументы
Конечно.цель не состояла в том, чтобы использовать статический метод, как указано выше, целью было создать оболочку с полиморфным поведением.Примечание: я использую VS 2010.
Обратите внимание, что вся необходимая информация доступна во время компиляции.Еще раз: проблема в том, что проверка выполняется перед созданием шаблона.
Добавление после обсуждения:
Ну, может быть, я не подчеркнул это должным образом,Речь шла не только о разнице между шаблонами и шаблонами, но и о решении следующей проблемы: учитывая набор перегрузок, адресованных различным типам, я хочу создать набор классов-оболочек, обеспечивающих виртуальный метод (полиморфизм) для этих типов.Цена разрешения виртуальных методов во время выполнения минимальна и не влияет на производительность.Это где шаблоны C ++ были удобны.Очевидно, что накладные расходы на разрешение типа во время выполнения для dynamic весьма различны.Итак, вопрос заключается в том, можно ли преобразовать существующие перегрузки в полиморфизм без репликации кода и без уплаты штрафа за производительность (например, я не уверен, что получаю с dynamic по сравнению с «switch», пытающимся привестикроме более приятного синтаксиса).
Одним из решений, которые я видел до сих пор, было генерирование / испускание кода (sic!), т.е. вместо вырезания и вставки, чтобы сделать это автоматически.
Итак, вместо обработки шаблонов C ++ мы просто делаем это вручную или просто заново изобретаем процессор макросов / шаблонов.
Что-нибудь лучше?