установить / получить доступ к неровным значениям карты, сделанным с помощью map ‹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

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

Забавно то, что с теми же обозначениями я получаю точно такую ​​же ошибку.


person Community    schedule 15.09.2013    source источник


Ответы (2)


std::map<std::string, boost::any> accounts;
accounts["bank"] = std::map<std::string, boost::any>();
accounts["bank"]["cash"] = 100;

Конечно, это вызывает ошибку времени компиляции, которую вы помещаете в boost :: any std :: map, но компилятор не знает об этом. аккаунты ["bank"] имеют тип 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;
}
person fghj    schedule 15.09.2013
comment
ржу не могу. Я собирался сделать это в крайнем случае. Огромное спасибо! - person ; 15.09.2013

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

Замените строку типа на 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;
}

Как это работает?

  • Карты - это пары ключ и значение.

accounts ["bank"] возвращает значение самой внешней карты, которая соответствует

map<string, **map<string, string>**>

accounts ["bank"] ["cash"] возвращает значение самой внутренней карты, которая соответствует

map<string, map<string, **string**>>

Определение одномерной карты не позволяет вам делать то, что вы хотите, в отличие от двухмерных карт.

person Steven Huang    schedule 15.09.2013
comment
Спасибо, Стивен. Пожалуйста, ознакомьтесь с моими изменениями для получения более подробной информации о том, как я объявил и инициализировал. - person ; 15.09.2013
comment
Хорошо, замените вашу первую строку на std :: map ‹std :: string, std :: map‹ std :: string, boost :: any ›› accounts; и удалите вторую строку. Теперь он должен работать. - person Steven Huang; 15.09.2013
comment
хммм, мне нужно иметь возможность добавлять значения, как в первом связанном вопросе. в любом случае спасибо! - person ; 15.09.2013