C++ 有没有办法创建一个指针类型,可以指向具有不同Comp模板参数的集合?

C++ 有没有办法创建一个指针类型,可以指向具有不同Comp模板参数的集合?,c++,C++,我有两个set对象,声明如下: set<order, Comp1> s1(comp1); set<order, Comp2> s2(comp2); 我有两个sets:一个元素按升序排序,另一个按降序排序。我有一个函数,可以处理向两个集合中的任何一个添加新元素时,它需要“吃掉”另一个set的前几个元素,以便两个集合中的元素不重叠(这意味着升序排序集合的第一个元素大于降序排序集合的第一个元素)。我可以编写两个函数来处理将元素添加到一个集合时的情况,以及将元素添加到另一个集合

我有两个
set
对象,声明如下:

set<order, Comp1> s1(comp1);
set<order, Comp2> s2(comp2);

我有两个
set
s:一个元素按升序排序,另一个按降序排序。我有一个函数,可以处理向两个集合中的任何一个添加新元素时,它需要“吃掉”另一个
set
的前几个元素,以便两个集合中的元素不重叠(这意味着升序排序集合的第一个元素大于降序排序集合的第一个元素)。我可以编写两个函数来处理将元素添加到一个集合时的情况,以及将元素添加到另一个集合时的情况。但大多数代码只是重命名表示这两个集合的变量。一切都很好,直到我需要能够擦除集合中的一些元素。我可以有两个映射并检查这两个映射,以查看元素是否位于
s1
s2
中。但是最好有一个映射来存储所有这些信息。

所有模板参数都是该类型的一部分。要使指针同时指向这两个集合,您需要一个“通用”指针,如
void*
,然后在使用时将其转换为正确的类型

这种强制转换使得解决方案几乎毫无用处,因为您需要知道指针的确切类型,如果您将其强制转换为错误的类型(即,当指针真正指向
s1
时,将其强制转换为
std::set*
),则会出现未定义的行为

根据您的设计和用例,您可以使用模板。如果需要将指针传递给泛型函数集,或者将其存储在类中,那么这种方法非常有效


简言之:除非在某些情况下可以使用模板,否则它实际上是不可行的。

这就是
union
s有用的地方

union pSet
{
    set<order, Comp1>* comp1;
    set<order, Comp2>* comp2;
};

union pSet p.comp1 = &s1;
/* do work with pSet.comp1 */
p.comp2 = &s2;
/* ... */
联合pSet
{
设置*comp1;
设置*comp2;
};
联合pSet p.comp1=&s1;
/*请使用pSet.comp1*/
p、 comp2=&s2;
/* ... */

不过,您可能会有更好的名称。

有一些不相关的类型,
boost::variant
可能会有所帮助。无法使用迭代器遍历s1和s2来提供解决方案所需的内容吗?您的问题似乎是由糟糕的设计造成的。也许我们可以更好地帮助你,如果你陈述让你进入这篇文章的更大的问题。听起来像是XY问题。你能修改你的问题来解释你为什么需要这个吗?@zenith什么是XY问题?我将修改这个问题来说明我为什么需要这个。我希望有一个地图告诉我一个给定的索引,它设置了索引所在的位置。有没有办法制作该映射?@Rich唯一的解决方案是使用Jarod42建议的方法。您仍然必须跟踪
联合
的哪个组件实际处于活动状态,也就是说,您需要一个布尔标志。否则,你会冒着无意中将一种类型重新解释为另一种类型的风险,这会给你带来如中所指出的未定义的行为。这是真的,如果工会用户无法跟踪其状态,工会必须为她这样做。
union pSet
{
    set<order, Comp1>* comp1;
    set<order, Comp2>* comp2;
};

union pSet p.comp1 = &s1;
/* do work with pSet.comp1 */
p.comp2 = &s2;
/* ... */