стирание типа. идиома, которая была придумана в C++11
хранить в объекте разные типы, динамически подменяя их
она заключается в том, чтобы делать шаблонных наследников от полиморфного базового класса
за указателем на родителя прячем шаблонного наследника и за счёт механизма виртуальных функций в рантайме можем подменять тип того, что хранится
если неправильно написать тип в std::any_cast, то будет runtime error std::bad_any_cast
нужно точное соответствие типа (const и & можно навешивать)

type erasure возможен без виртуальных функций
в std::any это реализовано без виртуальных функций, а статически генерируется тот или иной шаблон (как в std::function, типо vtable вручную написан)