C ++通用树比较两个标准

时间:2017-04-30 03:38:39

标签: c++ templates generics

我开始研究通用树,我是C ++的新手。我希望能够形成两个相同元素的树,但是在每个树中以不同的方式进行比较。从我能告诉我是否超载<那我只能定义一个功能。我以为我可能会传递指向函数的指针,但我觉得这是错误的方法。

template<class T, int (*Comp)(T*, T*)> class Tree 

尝试这样做的可行方法是什么? 感谢

1 个答案:

答案 0 :(得分:3)

不,你想要指定一个函数的指针(这样做会禁止使用函数对象,这通常是可取的)。

模板参数通常应该是一个类型参数 - 在这种情况下,您几乎肯定希望提供默认值std::less<T>,所以它看起来像这样:

template <class T, class Comp = std::less<T>>
class Tree {
     // Implementation here.    
};

允许实例化指向函数的指针,但(如上所述)也将支持函数对象。

但请注意,模板参数仅指定用于进行比较的事物的类型。在典型情况下,您需要该类型的实例来执行某些操作。您通常会在构建对象时指定此对象,因此您将拥有以下内容:

template <class T, class Comp = std::less<T>>
class Tree {
public:
    Tree(Comp c = Comp()) : c(c) {}

    bool insert(T value) {
        if (c(value, root->value)) // if value < root->value
            // ...
        else if (c(root->value, value)) // if root->value < value
    }
private:
    struct Node { 
        T key;
        Node *left , *right;
    } *root;

    Comp c;     
};

因此,template参数指定进行比较的事物的类型。我们给它默认为std::less<T>;这对于内置类型以及使a<b成为合法表达式的任何其他东西都很好(假设我们想要进行比较)。如果我们提供不同类型,则可以使用它来确保它定义严格的弱排序。

然后我们将比较类型的实例传递给构造函数。同样,我们指定该类型的默认构造实例的默认值。对于像std::less<T>std::greater<T>这样的函数对象类型的常见情况,默认构造对象将做正确的事情,因此我们只需要这些。

对于想要使用指向函数的指针的不太常见的情况,我们必须指定正确的类型作为模板参数,我们必须将指向正确函数的指针传递给构造