Здравствуйте, Went, Вы писали:
BFE>>Вроде бы ничего экстраординарного. Я что-то упускаю? (ну, кроме dll и so, конечно)
W>По-моему, такая реализация лишает всю затею смысла:
W>1. Представьте, что где-то есть шаблон-наследник класса А. Теперь программист начинает ручками дописывать все возможные инстанции для всех виртуальных шаблонов методов?
Нет, вы не поняли. Запись:
void B::virt_fun<int>(int) = default;
должна заставлять компилятор сгенерить по уже известному шаблону тело данной функции.
W>2. Представьте, что программист знает, что шаблон функции virt_fun для класса B с параметром std::string никогда не потребуется на практике, он используется только для А. Он все равно должен будет сообщить об этом компилятору чем-то вроде:
W>W>//virtual
W>void B::virt_fun<std::string>(std::string) = 0;
W>
W>чтобы, если программа где-то изменится, и этот вызов все-таки произойдет, получить pure virtual function call? Неплохое поле для неожиданных ошибок.
Я такого не предлагаю.
W>3. Ваша идея неплохо решается на обычном С++ с ручной регистрацией обработчиков — под двум type_id — this и T. Чуть более многословно, но это можно все элегантно порулить макросами.
Всё можно написать руками, но не удобно — легко допустить ошибку. Собственно, только по этому и нужно то, что я предлагаю.
Я не использую макросы и вам не советую.
W>4. То, что вы предлагаете, по сути, не шаблон виртуальной функции, а автоматизация перегрузки виртуальных функций (которая, и без автоматизации в С++ работает плохо) с перекладыванием части работы на линковщик (что тоже явно С++ придется не по вкусу).
А что же тогда шаблон виртуальной функции?