【问题标题】:C++ Generic Tree Comparing by Two CriteriaC++ 泛型树比较两个标准
【发布时间】:2017-04-30 03:38:39
【问题描述】:

我开始研究通用树并且我是 C++ 新手。我希望能够形成两棵相同元素的树,但在每棵树中以不同的方式进行比较。据我所知,如果我重载

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

尝试这样做的建议方法是什么? 谢谢

【问题讨论】:

    标签: c++ templates generics


    【解决方案1】:

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

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

    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;     
    };
    

    因此,模板参数指定了进行比较的事物的类型。我们给它一个默认的std::less&lt;T&gt;;这对于内置类型以及使a&lt;b 成为合法表达式的任何其他内容都可以很好地工作(当然,假设我们想要进行比较)。如果我们提供不同的类型,则需要使用它来确保它定义了严格的弱排序。

    然后我们将比较类型的 instance 传递给构造函数。同样,我们指定该类型的默认构造实例的默认值。对于像std::less&lt;T&gt;std::greater&lt;T&gt; 这样的函数对象类型的常见情况,默认构造的对象会做正确的事情,这就是我们所需要的。

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

    【讨论】:

      猜你喜欢
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多