Как назначить производный класс из базового ptr для nlohmann::json

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

Поскольку я использую классы значений, которые все являются производными от базового класса Value, я хотел бы позволить всем разработчикам создавать свои собственные классы значений в библиотеке lib. Поэтому мне нужен механизм для присвоения такого значения объекту 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;
}

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

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

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

1 ответ

Решение

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

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