我正在尝试设计一种数据结构,它可以通过存储一些关于其成员的额外数据来增强/补充现有的数据结构。
假设我们有:
class A {
int x;
string y;
};
我们希望有一个与之关联的 GUI 组件,因此数据成员具有相应的 GUI 元素。我想将成员映射到各自的组件。就像是
class GuiA {
int x;
string y;
map<MemberHandle, GuiElement*> guiHandles;
}
我没有任何限制,但我希望结果可以轻松转换为原始类型。
我知道,我可以引入一个模板,例如GuiElementMember
保存原始数据和GuiElement
指针,并将类成员交换为装饰的对应对象,所以它看起来像:
class GuiA {
GuiElementMember<int> x;
GuiElementMember<string> y;
}
但我想避免它,因为它完全改变了对数据成员的访问模式并使其膨胀。即它的结果是数据成员与指针交错,不容易去除。
理想情况下,可以写成GuiA
的派生类A
,或者写成 的组合A
和附加的东西。
我正在考虑类可以生成地图的模板之类的东西。我可以为每个组件编写一个自定义类,但我认为没有一种简单的方法来映射数据成员,所以在客户端它看起来像getGuiMember(GuiA::x)
. 指向数据成员的指针包含成员原始类型。我认为不可能有像“类型擦除的成员指针”这样可以用作MemberHandle
类型的东西。
我想到的唯一一件事是enum
每个组件的自定义,它将枚举数据成员并用作地图(或本例中的向量)的键类型,但这似乎是大量的信息复制和维护。
是否有一些允许映射数据成员的技术?
只要接口简单,我并不真正关心实现的复杂性。我欢迎提升或模板魔术。我也不关心额外数据访问的性能,它是额外的东西,但普通类的使用不应该受到影响,因此引入无法优化的间接性不太受欢迎。
编辑:请不要依赖 GUI 的东西,这是一个例子。我只关心为每个成员存储一些额外的数据,而不是与成员一起组成。