如何将 derived class 从 base ptr 分配给 nlohmann::json
How to assign derived class from base ptr to nlohmann::json
我正在玩某种共享对象框架。
它使用 nlohmann::json 提供消息传递和配置,并根据 json 配置加载消息处理程序和数据源。
因为我使用的值 classes 都是从基础 class 值派生的,所以我想允许所有开发人员在库。因此,我需要一种机制来将这样的值分配给 json 对象。
但是,如果我只使用指向基的指针,我该如何实现呢?class?
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。
我曾经从提供 "asString" 的模板 Base 派生,返回我的字符串 class,因为它在基础 class.
中不可用
使用自己的字符串 class 的唯一原因是提供通用值接口。是否有另一种获取通用接口的方法?
您可以为 base
创建一个 virtual json tojson() const;
函数,然后在派生的 class 中覆盖它。然后,不使用 *pointer
,而是调用 pointer->tojson()
。 classes中的实现可以调用全局to_json
函数,或者全局函数调用class.
中的函数
我正在玩某种共享对象框架。 它使用 nlohmann::json 提供消息传递和配置,并根据 json 配置加载消息处理程序和数据源。
因为我使用的值 classes 都是从基础 class 值派生的,所以我想允许所有开发人员在库。因此,我需要一种机制来将这样的值分配给 json 对象。
但是,如果我只使用指向基的指针,我该如何实现呢?class?
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。 我曾经从提供 "asString" 的模板 Base 派生,返回我的字符串 class,因为它在基础 class.
中不可用使用自己的字符串 class 的唯一原因是提供通用值接口。是否有另一种获取通用接口的方法?
您可以为 base
创建一个 virtual json tojson() const;
函数,然后在派生的 class 中覆盖它。然后,不使用 *pointer
,而是调用 pointer->tojson()
。 classes中的实现可以调用全局to_json
函数,或者全局函数调用class.