安全地将比较器添加到类层次结构

时间:2016-11-12 12:59:47

标签: c++ templates reflection comparator

我看起来像一个简单而常见的场景,我无法弄清楚如何做到这一点。

我在类层次结构中有大约100个类(一些抽象,一些mixins乘法继承)。我想要做的就是找到一种简单的方法来比较这个层次结构中的对象,这样我就可以避免在它们的向量中重复。

也就是说,我的目标是,提供像f这样的函数vector::unique f(vector<Node*>)从其参数中删除重复项。

问题在于,如果我写了100个不同的比较器,那么我就无法检查我是否真的错过了其中一个比较器的场。

那么我该如何在C ++中做到这一点?

更具体地说,层次结构的根是Node。节点的每个子类C都具有以下类型之一的成员:

  1. N*,其中NNode的子类;

  2. vector<N*>,其中NNode的子类;

  3. 课程V,其中有V::operator<,其中V不是Node的子类;

  4. 如上所述vector<V>

  5. 例如,典型的类定义可能是:

    class N : public Node {
       public:
          vector<N*> children;
          vector<Node*> siblings;
          M* parent; //M is a subclass of Node
          Orientations vector<Orientation> ; // another class, with comparator
        };
    

    我也不确定我是否可以使用默认元组比较器,因为它不能正确处理向量成员。

    因此,对于类层次结构中的每个N,我想要一个方法,比如

     bool N::operator<(const N& o)
    

    确定是否this < o。有了这样的方法,我可以使用algorithm :: sort和algorithm :: unique来删除重复项。

    很容易用语言说出来。按字典顺序对每个班级的成员进行排序;按指点比较指针;并按字典顺序比较矢量。

    所以这是一句话来形容并且在反思的语言中是微不足道的 - 但是如何用C ++来做呢?

    效率无关紧要,我只是希望它能够在不小心遗漏某个领域的情况下工作 - 无论是现在还是将来。我没有办法测试,你看,如果我遗漏了一个字段,这就是为什么我不想手动操作(也是一个维护噩梦,写100个不同的操作符&lt; 100个不同的类)。< / p>

    那么C ++专家如何处理这种问题,每当有人有一个他们想要排序的对象的类层次结构时就必须出现这个问题?

0 个答案:

没有答案