Как назначить производный класс из базового ptr для nlohmann :: json - PullRequest
0 голосов
/ 30 сентября 2018

Я играю с какой-то структурой общих объектов.Он использует nlohmann :: json для обеспечения передачи и конфигурирования сообщений и загружает обработчики сообщений и источники данных в зависимости от конфигурации json.

Поскольку я использую классы значений, которые все являются производными от базового класса Value, я хотел быпозволить всем разработчикам создавать свои собственные классы значений внутри библиотеки.Поэтому мне нужен механизм для присвоения такого значения объекту json.

Но как этого добиться, если я использую только указатели на базовый класс?

using json = nlohmann::json;

class Base
{
 public:
  Base () :str("Hurray") { };
 private:
  // const std::string() { return str; }
  std::string str;
};


class Derived1 : public Base
{
 public:
  Derived1() { myInt = 1; };
 public:
  int myInt;
};


void to_json(json& j, const Derived1& p) {
  j = json{{"Derived1", p.myInt}};
}

void from_json(const json& j, Derived1& p) {
  j.at("name").get_to(p.myInt);
}

int main(int argc, char* argv[]) {

  json myJ;
  Derived1 D1;
  myJ["D1"] = D1;
  std::cout << "myJ: " << myJ.dump() << std::endl;

  std::shared_ptr<Base> pointer = std::make_shared<Derived1>();
  json DerivedJson;
  //  DerivedJson["D1"] = *pointer;
  //  std::cout << "myJ" << DerivedJson.dump() << std::endl;
}

(Пример такжеon https://github.com/Plurax/SOjsonassign)

Еще один вопрос: мой код в настоящее время использует собственную оболочку строки, которая является производной от Baseclass. Я имел обыкновение наследовать от шаблона Base, который предоставляет «asString», возвращая мой класс строки, как егонедоступно в базовом классе.

Единственная причина для собственного строкового класса - предоставить универсальный интерфейс значений. Есть ли другой способ получить универсальный интерфейс?

1 Ответ

0 голосов
/ 30 сентября 2018

Вы можете создать функцию virtual json tojson() const; для base, а затем переопределить ее в своих производных классах.Тогда вместо использования *pointer вызовите pointer->tojson().Реализация в классах может вызывать глобальную функцию to_json, или глобальная функция может вызывать функцию в классе.

...