Это не легко сделать с C ++. Это связано с тем, что называется «полиморфизмом первого класса», что означает, что было бы легко, если бы значения в C ++ могли иметь полиморфные типы. Это не тот случай.
Если вам подходит стандартное решение (это означает, что код f
должен быть одинаковым для всех T
), вы можете сделать это, но это будет трудоемкая задача.
По сути, вы захотите заменить параметр const T &t
параметром, тип которого не будет универсальным, но будет захватывать "внутри" все поведение, необходимое f
из t
s всех возможных типов. .
Для примера, скажем, T
должен быть функтором, который f
вызывает с аргументом int
. В этом случае вы измените объявление на
virtual void func(const std::function<void(int)>& t) { ... }
и виртуальные функции начнут работать. Однако это означает, что интерфейс T
s должен быть исправлен до того, как вы начнете реализовывать его в производных классах (то есть, если вы передумаете и захотите вызвать t
с аргументом типа ostream
, вы ' не повезло).
Однако создание таких полиморфных оболочек варьируется от простых (как boost::any
, boost::function
) до сложных или даже невозможных (any_iterator
). Это очень зависит от того, что вы хотите сделать.