Перегрузите оператор индекса для вызова функции в соответствии с назначенным типом.

У меня есть объект, который имеет такие функции, как addString а также addInteger, Эти функции добавляют данные в строку JSON. В конце можно получить и отправить строку JSON. Как сделать это проще, перегружая операторы нижних индексов, чтобы сделать следующее?

jsonBuilder builder();

builder[ "string_value" ] = "Hello";
builder[ "int_value" ] = 5;
builder[ "another_string" ] = "Thank you";

-4

Решение

Вам нужно иметь полномочие класс, который возвращается operator[] функция и которая обрабатывает назначение. Затем прокси-класс перегружает оператор присваивания, чтобы по-разному обрабатывать строки и целые числа.

Что-то вроде этого:

#include <iostream>
#include <string>

struct TheMainClass
{
struct AssignmentProxy
{
std::string name;
TheMainClass* main;

AssignmentProxy(std::string const& n, TheMainClass* m)
: name(n), main(m)
{}

TheMainClass& operator=(std::string const& s)
{
main->addString(name, s);
return *main;
}

TheMainClass& operator=(int i)
{
main->addInteger(name, i);
return *main;
}
};

AssignmentProxy operator[](std::string const& name)
{
return AssignmentProxy(name, this);
}

void addString(std::string const& name, std::string const& str)
{
std::cout << "Adding string " << name << " with value \"" << str << "\"\n";
}

void addInteger(std::string const& name, int i)
{
std::cout << "Adding integer " << name << " with value " << i << "\n";
}
};

int main(int argc __attribute__((unused)), char *argv[] __attribute__((unused)))
{
TheMainClass builder;
builder[ "string_value" ] = "Hello";
builder[ "int_value" ] = 5;
builder[ "another_string" ] = "Thank you";
}

Смотрите здесь для рабочего примера.

1

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

Я думаю, что вам это нужно наконец. Я реализовал для получения ввода строки, сделать то же самое для целого числа.

#include <iostream>
#include <string>
#include <map>

class jsonBuilder
{
public:
std::map<std::string,std::string> json_container;
std::string&  operator[](char *inp)
{
std::string value;
json_container[std::string(inp)];
std::map<std::string,std::string>::iterator iter=json_container.find(std::string(inp));

return iter->second;
}
};

int main()
{
jsonBuilder jb;
jb["a"]="b";

std::map<std::string,std::string>::iterator iter=jb.json_container.find(std::string("a"));
std::cout<<"output: "<<iter->second;
}
0

По вопросам рекламы [email protected]