比较模板变量的值

时间:2012-11-11 22:38:30

标签: c++ templates linked-list

我正在编写一个C ++类的链接列表,并试图弄清楚如何比较排序算法的两个泛型类型节点。在Java中,我将实现Comparable接口并使用compareTo()方法来确定哪个是“更大”或“更小”,让Collection的用户定义它。我可以使用C ++中的类似内容吗?我知道我可以覆盖“<”运营商,但我不知道这是否是“最好的”方法(主观的,我知道;实际上只是要求利弊,如果有另一种)来比较未知类型。

那么,是否还有其他选项可以在运行时比较未知类型,这些选项似乎比覆盖“<”更合适操作

编辑:更改了我需要覆盖的操作符。

2 个答案:

答案 0 :(得分:2)

从我收集到的内容中,您有一个列表类模板,并且您希望在其上实现sort()方法。我会按照std::list<T>设置的示例来执行此操作:

template <typename T>
class List
{
public:
    // ...
    template <typename Compare>
    void sort(Compare compare) {
        // use compare(x, y) to determine if x is smaller than y
    }
    void sort() { this->sort(std::less<T>()); }
};

也就是说,不是做出固定的选择,而是默认使用operator<(),但允许用户使用不同的排序谓词。只要比较函数实现了strict weak order,就可以使用任何东西。

答案 1 :(得分:1)

  1. 是的,重载运算符(用于排序,您使用operator<operator==)就是这样。它不是惯用的,你不需要标记界面(比如从特定的界面派生),通常不会这样做。

    好处是,即使用户想要使用没有关系运算符的某种类型,他/她也可以通过提供运算符的自由函数重载来扩展其接口。

  2. 您可以使用任何其他方法(例如发明您自己的接口,例如函数int T::cmp(...),它将返回0/1 / -1,具体取决于参数的关系。但是,这有你不能重复使用其他课程的好处。

  3. STL使用用户传递的函数对象对象来比较它所需要的东西,这是在相同数据上提供不同排序顺序所需的(例如,按姓氏与电话号码排序)。如果您不需要(或准备放弃此功能),您可以坚持使用operator<