如何从 json 字符串创建工厂方法
How to create a factory method from json string
我想编写一个工厂方法,从具有以下签名的 json 字符串(或 xml 字符串)构造 C++ 对象:
BaseClass * create_class_from_json(const std::string & json_str)
{
如果我传递以下 json 字符串,该方法首先确定 class 是 Derived1
并使用提供的参数调用 的构造函数。
{
'class_name':'Derived1'
'param1':10
}
实现这个的标准方法是在 class_name
上有一个很长的 if
语句,并在不同情况下构造适当的 class:
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++ 中有更好/更优雅的方法吗?
不,不是真的。 C++没有反射。
但是,您可以将此作为构建过程中的预处理步骤,在 C++ 之外。让 Python 脚本生成一些 C++ 对象声明到源文件中,然后编译。
没有直接的解决方案,但最近我看到了一个不错的 article which can help you solve this in quite clever way。
基本上你的工厂必须是一个单例并且创建的对象正在使用一个模板将每个类型注册到这个单例。
这与google测试中的测试非常相似,在一些单例中是自注册的。
请阅读文章了解更多详情。
我想编写一个工厂方法,从具有以下签名的 json 字符串(或 xml 字符串)构造 C++ 对象:
BaseClass * create_class_from_json(const std::string & json_str)
{
如果我传递以下 json 字符串,该方法首先确定 class 是 Derived1
并使用提供的参数调用 的构造函数。
{
'class_name':'Derived1'
'param1':10
}
实现这个的标准方法是在 class_name
上有一个很长的 if
语句,并在不同情况下构造适当的 class:
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++ 中有更好/更优雅的方法吗?
不,不是真的。 C++没有反射。
但是,您可以将此作为构建过程中的预处理步骤,在 C++ 之外。让 Python 脚本生成一些 C++ 对象声明到源文件中,然后编译。
没有直接的解决方案,但最近我看到了一个不错的 article which can help you solve this in quite clever way。
基本上你的工厂必须是一个单例并且创建的对象正在使用一个模板将每个类型注册到这个单例。
这与google测试中的测试非常相似,在一些单例中是自注册的。
请阅读文章了解更多详情。