Я люблю сопоставление с шаблоном в стиле Haskell.
Тогда напишите свою программу на Haskell.
То, что вы пытаетесь сделать, это переключение типа. Это обычная вещь, которую люди делают, если хотят избежать виртуальных функций. Теперь последние являются краеугольным камнем того, что такое ОО в C ++. Если вы хотите избежать их, почему вы программируете на C ++?
Что касается того, почему это осуждается: представьте, что у вас много такого кода
if(ptr.isType<Foo>()) ...
if(ptr.isType<Bar>()) ...
размазан по всему вашему коду, а затем кто-то приходит и добавляет Baz
к возможным типам, которые может представлять ptr
. Теперь вы просматриваете большую кодовую базу, пытаетесь найти все те места, где вы переключили тип, и пытаетесь выяснить, к каким из них нужно добавить Baz
.
И, как и у Мерфи, как только вы закончите, придет Foz
, который также будет добавлен как тип. (Или, подумав еще раз, если у Мерфи будет свой путь, он закрадется за до , у вас был слишком полный шанс добавить Baz
.)