如何将派生类从基本ptr分配给nlohmann :: json

时间:2018-09-30 20:07:15

标签: c++ 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派生的。 我曾经从提供“ asString”的模板Base派生,返回了我的字符串类,因为它在基类中不可用。

拥有自己的字符串类的唯一原因是提供一个通用值接口。还有另一种获取通用接口的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以为virtual json tojson() const;创建一个base函数,然后在派生类中重写该函数。然后,不使用*pointer,而是调用pointer->tojson()。这些类中的实现可以调用全局to_json函数,或者全局函数可以调用该类中的一个。