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

Is there any way to create one pointer type that can point to sets with different Comp template argument?

本文关键字:Comp 参数 创建 类型 指针 一个 有没有      更新时间:2023-10-16

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

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

comp1comp2 分别是类型 Comp1Comp2 的函子。

我想知道是否有任何方法可以根据我的需要使用某种类型的指针指向s1s2

set<order>*似乎不起作用。我希望有一个map<int, set<order>*>告诉我给定的索引,它set(通过指针(索引(及其存储在order中的相关信息(在其中。有什么方法可以制作那张地图吗?

更新:我正在试验函数模板。函数原型为:

template <typename IN, typename WAIT>
void process_incoming(multiset<order, IN> &incoming, multiset<order, WAIT> &waiting, int seq)

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

所有模板参数都是类型的一部分。要制作一个可以指向两个集合的指针,你需要一个像 void * 这样的"泛型"指针,然后在使用它时将其转换为正确的类型。

这种强制转换使解决方案几乎无用,因为您需要知道指针的确切类型,如果您将其转换为错误的类型(即当它真正指向s1时将其转换为std::set<order, Comp2>*(,您将具有未定义的行为

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

简而言之:除非在某些情况下您可以使用模板,否则这确实不可行。

这就是

union有用的地方。

union pSet
{
    set<order, Comp1>* comp1;
    set<order, Comp2>* comp2;
};
union pSet p.comp1 = &s1;
/* do work with pSet.comp1 */
p.comp2 = &s2;
/* ... */

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