用yamlc++加载继承的对象

Loading inherited objects with YAML C++

本文关键字:对象 继承 加载 yamlc++      更新时间:2023-10-16

我有一些继承类:

struct BasicShape;
struct Circle : BasicShape;
struct NGon : BasicShape;
struct Star : NGon;
struct Triangle : NGon;

…和YAML文件,其中包含以下行:

shapes:
  small_circle: [circle, 5]
  big_circle: [circle, 8]
  star7: [ngon, 7, 3]

…显然,它们代表了不同的形状和不同的选项。

我想将这些行转换为所需类的实例。可以预见的是,我正在使用BasicShape *来处理我需要的一切。

最后我写了两个类似的解决方案:

立即将形状转换为BasicShape *:

namespace YAML {
  template<> struct convert<BasicShape *> { /* code goes here */ };
}

由于不能防止内存泄漏而被拒绝。

创建一个包装器,将所有内容委托给指针,并在必要时销毁它:

struct Shape {
  BasicShape * basic_shape;
  /* code goes here */
};
namespace YAML {
  template<> struct convert<Shape> { /* code goes here */ };
}

是否有其他更好的方法来处理这个任务?


我发现了"我可以在编译时读取文件并构造异构对象吗?"的问题,答案很好,但我不需要所有的答案的灵活性。我相信在我的情况下,使用BOOST或不使用BOOST(这是更可取的)都可以简化解决方案。

第二个解决方案是正确的方法。Yaml-cpp只处理值类型,所以如果您想要任何类型的继承,就需要像您所做的那样,手动将多态类型包装在值类型中。