Проблема в том, что выбранный в данный момент тип известен только во время выполнения, тогда как «получение» типа должно быть сделано во время компиляции.Именно поэтому у нас есть посетители - чтобы скрыть неизбежную цепочку операторов if
, стоящих за реализацией variant
.
Вместо того, чтобы заново изобретать эту реализацию, было бы лучше выполнить диспетчеризацию вашей карты извнутри такого посетителя.
Если это не удастся, вам придется написать собственную цепочку операторов if
, создающих код, похожий на использование посетителя, но, вероятно, более медленный и менее обслуживаемый!
Это правда, что вы не можете реализовать такую вещь, прочитав index()
, затем попросив вариант дать вам эквивалент typeid
, как вы могли бы с реализацией Boost.Но я почти уверен, что это умышленно, потому что (как я уже говорил выше) любой код, использующий это, будет опрометчивым.Конечно, если бы вы действительно хотели, вы могли бы написать посетителю, чтобы создать такой typeid
!Но тогда вам все равно придется написать условную логику, чтобы справиться с этим значением, когда вы могли бы просто поместить логику в посетителя.