Установить / получить доступ к зубчатым значениям карты, сделанным с помощью карты<string, boost:: any>
Мне было показано, как создать зубчатый многомерный std::map
используя boost::any
,
Однако у меня возникли проблемы с установкой значений, как в этом ответе.
Когда я использую
accounts["bank"]["cash"] = 100;
gcc
дает эту ошибку
error: no match for ‘operator[]’ in ‘accounts.std::map<_Key, _Tp, _Compare,
_Alloc>::operator[]<std::basic_string<char>, boost::any,
std::less<std::basic_string<char> >, std::allocator<std::pair<const
std::basic_string<char>, boost::any> > >((* & std::basic_string<char>(((const
char*)"bank"), (*(const std::allocator<char>*)(& std::allocator<char>())))))["cash"]’
Как может зазубренный многомерный map
создан с boost::any
быть доступным? (Если есть лучшая техника, чтобы сделать это, пожалуйста, покажите мне. Я забочусь только о том, что работает и быстро написать.)
многомерная декларация
std::map<std::string, boost::any> accounts;
accounts["bank"] = std::map<std::string, boost::any>();
accounts["bank"]["cash"] = 100;
Я сдался и попытался использовать JSON-Spirit mObject
вместо этого, поскольку все это кажется уже встроенным.
Забавно, что при одинаковых обозначениях я получаю точно такую же ошибку.
2 ответа
std::map<std::string, boost::any> accounts;
accounts["bank"] = std::map<std::string, boost::any>();
accounts["bank"]["cash"] = 100;
Конечно, это приводит к ошибке времени компиляции, которую вы помещаете в boost:: any std:: map, но компилятор об этом не знает. счета ["банк"] имеют тип boost:: any, а boost:: any не имеют
int& operator[](const char *)
Узнайте, как boost:: any работает: http://www.boost.org/doc/libs/1_54_0/doc/html/any/s02.html
Исправить тривиально:
#include <boost/any.hpp>
#include <map>
#include <string>
int main()
{
std::map<std::string, boost::any> accounts;
accounts["cash"] = 100;
accounts["bank"] = std::map<std::string, boost::any>();
boost::any_cast<std::map<std::string, boost::any> &>(accounts["bank"])["cash"] = 100;
}
Как вы определили свою карту аккаунтов? Как сказал Борис, вам нужно вложить две карты вместе, чтобы делать то, что вы хотите.
Замените строку типа на boost::any
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
map<string, map<string, string>> accounts;
accounts["bank"]["cash"] = "infinity";
cout << accounts["bank"]["cash"];
return 0;
}
Как это работает?
- Карты - это пары ключей и значений.
account ["bank"] возвращает значение самой внешней карты, которая соответствует
map<string, **map<string, string>**>
account ["bank"]["cash"] возвращает значение самой внутренней карты, которая соответствует
map<string, map<string, **string**>>
Определение 1-мерной карты не позволяет вам делать то, что вы хотите, но 2-мерные карты делают.