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 с конкретными перегрузками перед создание:
Ошибка 3 Лучшее совпадение перегруженного метода для 'TestGenericPolyMorph.Poly.WriteVal (int)' имеет некоторые недопустимые аргументы
Конечно. цель заключалась не в использовании статического метода, как указано выше, а в создании оболочки с полиморфным поведением. Примечание: я использую VS 2010.
Обратите внимание, что вся необходимая информация доступна во время компиляции. Еще раз: проблема в том, что проверка выполняется до создания экземпляра шаблона.
Дополнение после обсуждения:
Ну, может быть, я не особо подчеркнул это. Речь шла не только о разнице между дженериками и шаблонами, но и о решении следующей проблемы: учитывая набор перегрузок, обращающихся к разным типам, я хочу сгенерировать набор классов-оболочек, предоставляющих виртуальный метод (полиморфизм) для этих типов. Цена разрешения виртуальных методов во время выполнения минимальна и не влияет на производительность. Вот где пригодились шаблоны C ++. Очевидно, накладные расходы на разрешение типа времени выполнения для динамического совсем другие.Итак, вопрос в том, можно ли преобразовать существующие перегрузки в полиморфизм без репликации кода и без потери производительности (например, я не уверен, что я получаю с динамическим по сравнению с «переключением», пытающимся преобразовать кроме лучшего синтаксиса).
Одно из решений, которое я видел до сих пор, заключалось в генерации / выдаче кода (sic!), То есть вместо автоматического вырезания и вставки.
Итак, вместо обработки шаблонов C ++ мы просто делаем это вручную или заново изобретаем процессор макросов / шаблонов.
Что-нибудь получше?