我的要求是解析XML并填充对象。一旦从Xml填充对象,如何自动跟踪属性xyz是否存在。请注意,在填充对象后,我将无法再访问已解析的缓冲区。因此,我需要一些机制来了解该属性是否存在于XML中,并且该对象是否填充在对象中。
我在脑海中有以下解决方案,但不确定是否有更高效的可能性。此外,我正在寻找这个问题的通用解决方案。
为类中的每个属性定义一个位。
setter函数应该在属性存在时解析XML时设置该位
getter函数应在通过引用参数返回属性值之前检查该位。未设置位时应返回false。 (getter函数返回类型应该是boolean并且它接受一个属性类型的属性并在存在时填充它)
答案 0 :(得分:1)
从你的评论我收集到你可以改变设计,所以这就是我要做的:
如果前者不可用,则将所有可选成员替换为具有恰当名称的std::optional
或等效提升。
using std::optional; // facilitates easy switching between std and boost if needed
class MyClass {
optional<int> some_value;
// Similarly for rest of attributes
void set_some_value(int value_to_store) { some_value = value_to_store; }
optional<int> get_some_value() { return some_value; }
}
要阅读它,请执行以下操作
MyClass instance;
// ... parse XML and set attributes
auto some_value = instance.get_some_value;
if (some_value) {
do_something_with_int(*some_value);
}
关于optional
的一些说明:
默认构造的optional
为空。这意味着默认情况下,未明确设置的每个属性都为空。
取消引用空的可选项是未定义的行为。有更安全的方式来访问它。在这个例子中它是安全的,因为我们手动检查它,因为我认为你想分支你的属性的存在。
保证托管对象位于已分配的optional
对象内。这意味着没有动态分配对速度有利。但是,如果您有任何大型对象,则可能导致堆栈溢出问题。但是,不太可能,大型对象的大多数真实场景都使用string
或某些STL容器/包装器,无论如何都将数据保存在堆上。
我无法在标准中找到空间成本。我相信它通常在每个可选对象中使用单个bool
实现。 sizeof(bool)
通常是sizeof(int)
。这使得它比必要的空间消耗更多,但它尽可能快。这通常是一个很好的权衡,但是如果你遇到内存使用问题并且有很多对象持有optional
,你可能需要找到一个更加空间最优的解决方案。如果您可以使用sentinel值来表示不存在,请查找紧凑可选对象的实现。