установить / получить доступ к значениям зубчатой ​​карты, созданным с помощью карты & lt; string, boost :: any & gt;

Я был показано, как создать зубчатый многомерный 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-дух

Я сдался и попытался использовать JSON-Spirit mObject вместо этого, поскольку все это кажется уже встроенным.

Забавно, что при одинаковых обозначениях я получаю точно такую ​​же ошибку.

0

Решение

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»,
и повысить :: любой не имеет

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;
}
1

Другие решения

Как вы определили свою карту аккаунтов? Как сказал Борис, вам нужно вложить две карты вместе, чтобы делать то, что вы хотите.

Замените строку типа на 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-мерные карты делают.

0