c++ - 如何从 json 字符串创建工厂方法

标签 c++ json constructor factory

我想编写一个工厂方法,从具有以下签名的 json 字符串(或 xml 字符串)构造 C++ 对象:

BaseClass * create_class_from_json(const std::string & json_str)

{

如果我传递以下 json 字符串,该方法首先确定类是 Derived1 并使用提供的参数调用 的构造函数。

{
'class_name':'Derived1'
'param1':10
}

实现这个的标准方法是在 class_name 上有一个很长的 if 语句,并在不同情况下构造适当的类:

BaseClass * create_class_from_json(const std::string & json_str){
    std::string class_name = json::extract_field(json_str, 'class_name');
    if (class_name == 'Derived1')
    {
      int param1 = json::extract_field(json_str, 'param1')
      return new Derived1(param1);
    }
    else if (class_name == 'Derived2')...

}

在 C++ 中有更好/更优雅的方法吗?

最佳答案

没有直接的解决方案,但最近我看到了一个不错的 article which can help you solve this in quite clever way .

基本上你的工厂必须是一个单例并且创建的对象使用一个模板将每个类型注册到这个单例。

这和google test中的test很像,都是在一些单例中自注册。

请阅读文章了解更多详情。

关于c++ - 如何从 json 字符串创建工厂方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48818445/

相关文章:

python - 如何在Python中将datetime.date对象转换为字符串

json - 如何使用带有动态键的 Swift 4 从嵌套的 JSON 中提取数据

c++ - 默认的 Move 构造函数是否定义为 noexcept?

java - 找不到符号 - 构造函数(java)

c++ - 为什么没有从 std::tuple<Ts...>& 到 std::tuple<Ts&...> 的(隐式)转换?

javascript - 帮助将图像动态加载到 Galleria

c++ - 函数返回指向函数指针的指针

c# - 你有没有在运行时看到一个对象(C#)在构造它之后返回 null?

c++ - 重载方法未在强制转换运算符重载中调用

android - 如何在 native 代码中从 Android 扩展文件中获取文件数据