Многомерная зубчатая карта

Я новичок на C++, пытающийся создать личный финансовый веб-сервер, который в реальном времени отслеживает все мои активы и пассивы.

Я обнаружил, что могу сделать mapс maps иметь многомерную систему пар ключ-значение.

Я также обнаружил, что boost::any а также boost::variant может использоваться для хранения нескольких типов значений. Моя проблема в том, что некоторые уровни не очень сложны по сравнению с другими. Например, банковский счет будет иметь только значение, сумму на счете, в то время как брокерский счет будет иметь много типов инвестиций и характеристик, поэтому я хотел бы сделать что-то вроде (в json):

{
    'bankAccount': 100.00,
    'brokerageAccount': {
        'stocks': {
            'companyName': 'Stack Exchange',
            'ticker': 'STAK',
            'pps': bazillion
            ...

куда bankAccount а также brokerageAccount может быть insertЭд и erased при необходимости и выбрасывают при необходимости.

Я действительно не знаю, куда идти отсюда. Когда я пытаюсь поставить

map<string, boost::any> accounts;
accounts["cash"] = 100;
accounts["brokerageAccount"] = map<string, boost::any>;

в private раздел broadcast_server в этом сервере веб-сокетов, gcc с этими флагами -I ~/websocketpp-master/ -std=c++0x -D_WEBSOCKETPP_CPP11_STL_ -D_WEBSOCKETPP_NO_CPP11_REGEX_ -lboost_regex -lboost_system -L/usr/lib -pthread -O0 -ljson_spirit дает error: ‘accounts’ does not name a type за последние две строки.

Как лучше всего хранить данные в формате json выше, с возможностью добавлять и удалять ключи и значения в любом месте?

2 ответа

Решение
accounts["brokerageAccount"] = map<string, boost::any>;

Вы не можете назначить тип для объекта. Чтобы исправить проблему, добавьте ()

accounts["brokerageAccount"] = map<string, boost::any>();

Вариант, который должен быть правильно скомпилирован:

#include <boost/any.hpp>
#include <map>
#include <string>

int main()
{
   std::map<std::string, boost::any> accounts;
   accounts["cash"] = 100;
   accounts["brokerageAccount"] = std::map<std::string, boost::any>();
}

map<string, boost::any> в последней строке указан тип, а не объект этого типа. Вы должны вызвать конструктор этого типа, чтобы создать аргумент. Измените последнюю строку на

accounts["brokerageAccount"] = map<string, boost::any>();

Это исправляет это в моей копии Visual Studio 2010

Другие вопросы по тегам