Pavel Samolysov
С вариантом та же проблема - нужно заранее знать весь набор используемых типов. Для расширяемости придумали std::any (как раз type erasure), но, насколько помню, там нужна лишняя аллокация, да и присвоить такому any можно что угодно.
any это type erasure для CopyConstructible, но мы можем te для своего концепта запилить. А то что аллокация, то для полиморфизма динамического на наследовании тоже используется дин. аллокация, так что можно вынести ее за скобки