Как назначить производный класс из базового 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
функция или глобальная функция может вызывать функцию в классе.