最近,我一直在尝试使用模板参数解决问题。问题可以简化如下:
假设我有三种描述性类型:姓名,年龄和职业。这些类型的每个实例都存储在一个静态向量中,其中包含其类型的所有其他元素。我还有一个由ID标识的项目列表,每个项目都由这些类型的某些组合组成。
例如,假设我有三个项目:
- GoldenGateBridge: {NAME: "Golden Gate", AGE: none, OCCUPATION: none}
- Baby: {NAME: none, AGE: 1, OCCUPATION: none}
- UnknownTrucker: {NAME: none, AGE: none, OCCUPATION: "Trucker"}
(我知道这些类型可能不是最好的例子,但为了论证,我们假设并非所有类型都是强制性的)。
这些项目将存储在包含构成它们的组件的向量中。更准确地说,
- Names: [GoldenGateBridge],
- Ages: [Baby],
- Occupations: [UnknownTrucker]
以这种方式存储项目的原因是存在一些逻辑块,它们组成某些类型的元素。例如,可能有一个函数SayEveryonesName,它作用于包含名称的所有元素。对于由单一类型组成的项目,这就像魅力一样。
然而,在上面的例子中,我说我决定给出名字" Tom"给宝贝。由于对象现在具有名称和年龄,因此我无法再将其存储在Name元素的向量中。相反,我想在包含Name 和 Age的元素的向量中创建一个新元素。这里所需的表示是:
- Names: [GoldenGateBridge],
- Ages: [],
- Occupations: [UnknownTrucker],
- NamesAndAges: [Baby]
就其本身而言,这仍然没有太大问题。可以创建具有元组类型的静态向量的模板化类,其模板参数表示它包含的组合类型(例如Holder,Holder,Holder)。
然而,这种方法引入了一些问题。即,如何表示模板化函数以向给定项添加或移除组合类型。例如,如果我添加< A> 指向由< B> ,结果项应存储在< A,B> 的向量。但是,如果我做相反的事情并添加一个由<组成的项目。 B> 指向由< A> ,结果项仍然存储在< A,B> 的矢量为< A,B> 。换句话说,元素的顺序在底层表示中不重要。
这引出了我的标题问题:是否有任何机制可以对模板参数进行排序? e.g。模板< Y,Z,X>将映射到模板< X,Y,Z>引擎盖下(假设这个例子我们的排序是模板参数类型的字母顺序)。
如果没有,有没有人对如何管理这样的情况有任何建议?一个有效的解决方案是简单地在每个的作曲类型中保留对给定项目的引用。向量,但是当给定的逻辑片段依赖于具有多种类型的项目时,这会牺牲性能。看起来代码生成也可以解决这个问题,因为人们可以专门枚举每种可能的类型组合,并定义所需的输出类型,以便为它添加每种可能的类型,但很明显,这会引入相当多的未使用类型的代码膨胀,并不是那么灵活,而且似乎有点笨拙。
另外,这种方法引入的另一个问题是检索组合类型成为一个多向量问题。例如,如果我有一条逻辑,它对所有类型为<的项目起作用。其中包含> ,我们希望处理所有< A> ** s,全部**< A,B> ** s,以及所有类型的形式**< A,B,...> 。我也不清楚这方面的最佳方法,但似乎这可能是解决前一个问题的最好方法。
你们提供的任何帮助都会非常有帮助,非常感谢。谢谢!