Для этого вам понадобится разнородная карта, то есть ее элементы могут быть разных типов.Кроме того, вам потребуется возможность возвращать типов из функций, а не только переменных.
Теперь гетерогенная карта была бы возможна с Boost.Variant
или простым union
, но это связывает ее со временем компиляции: нам нужно знать каждый тип, которыйможно создать этот вариант / объединение.
Конечно, Boost.Any
можно хранить все и его собаку, но проблема возникает снова: вам нужно извлечь real наберите из этого Boost.Any
снова.Проблема повторяется.И если вы знаете реальный тип, вы также можете просто сделать вариант / союз и избавить себя от неприятностей any_cast
.
Теперь, для другой неприятной вещи:
m.get<myMap["TYPE_1_IN_STRING_FORM"], myMap["TYPE_2_IN_STRING_FORM"]>
Чтобы эта строка работала, вам понадобятся две функции, которых нет в C ++: возвращаемых типов и шаблонов времени выполнения .Давайте на мгновение проигнорируем первую точку.
Шаблоны , время компиляции , и функция get
является таким шаблоном.Теперь, чтобы использовать этот шаблон, ваш myMap
должен иметь возможность возвращать типы в время компиляции , в то время как он заполняется в время выполнения .Видите противоречие?Вот почему необходимы шаблоны времени выполнения.
К сожалению, именно эти три вещи невозможны (или чрезвычайно сложны и очень и очень ограничены) в C ++ во время выполнения: гетерогенные типы данных (без постоянного размера), возвращая типов и шаблонов .
Все, что включает типы, должно быть выполнено во время времени компиляции . Этот пост от @Gman несколько коррелирует с этой проблемой.Это определенно стоит прочитать, если вы хотите знать, что C ++ просто не может сделать.
Итак, сделайте вывод: вам нужно переосмыслить и реорганизовать вашу проблему и решение,: |