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