Также, если вы используете сторонние библиотеки, убедитесь, что у вас есть правильные 32/64 битные файлы
Вы хотите использовать boost::variant
:
std::map <std::string, boost::variant<typeX, typeY>>
Вам нужно стирать типа .
Тип erasure - это шаблон, который скрывает базовый тип, такими известными примерами являются boost :: any , но имейте в виду, что у любого из них есть динамическое полиморфное поведение (динамическая отправка во время выполнения). boost :: variant, с другой стороны, является другим примером и использует методы метапрограммирования шаблонов. см. вариант vs any
Простейшее решение, хотя, могло бы написать собственное стирание типа класса с перечислением для базового типа.
Одним из способов реализации многотипной карты является использование отличных функций std :: tuple в C ++ 11, что позволяет получить доступ с помощью ключа типа. Вы можете обернуть это, чтобы создать доступ с помощью произвольных ключей. Подробное объяснение этого (и довольно интересного чтения) доступно здесь:
https://jguegant.github.io/blogs/tech/thread-safe-multi-type- map.html
С помощью некоторого метапрограммирования вы можете легко создать гетерогенную карту, которая может хранить любой тип из определенного набора типов. Вот пример , который делает это без стирания типа или необходимости посещать значения.
Являются ли подклассы типаX и typeY класса typeBase? Если это так, вы можете сделать std::map<std::string,typeBase*>
для хранения как типовX *, так и typeY * на карте.
Это, вероятно, будет чрезмерным излишеством, но QT имеет переменную QVariant, которая может использоваться для сопоставления с различными типами переменных (QT).
Документация здесь: http: // qt -project.org/doc/qt-5.0/qtcore/qvariant.html