Вам нужно стирать типа .
Тип erasure - это шаблон, который скрывает базовый тип, такими известными примерами являются boost :: any , но имейте в виду, что у любого из них есть динамическое полиморфное поведение (динамическая отправка во время выполнения). boost :: variant, с другой стороны, является другим примером и использует методы метапрограммирования шаблонов. см. вариант vs any
Простейшее решение, хотя, могло бы написать собственное стирание типа класса с перечислением для базового типа.