定制类的自定义比较器,就像STL一样

时间:2014-07-12 02:32:51

标签: c++ stl comparator

我有一个自定义类二进制搜索树。我想传递一个比较器类作为参数(默认为std :: less)。我搜索的大多数答案都使用STL对象,然后传递他们的自定义比较器。我想要一些不同的东西。

//树类

template <class T,class Compare = less<T>>
class Tree
{
    struct TreeNode
    {
        T data;
        struct TreeNode *  left;
        struct TreeNode *  right;
    };
public:
    void insert(T);
};

//自定义比较器类

template <class T>
class CustomCompare
{
public:
    bool compare(const T&, const T &);
};


template<class T>
bool CustomCompare<T>::compare(const T & a, const T &b)
{
    cout << "calling custom comparator";
    return a<b;
}

//在树中插入

template<class T,class Compare>
void Tree<T,Compare>::insert(T val)
{
      // HOW DO I CALL COMPARE HERE? I tried this
      if (compare(val->data , treeNode->data))  /// does not work.
       // I get error - use of undeclared identifier compare.


      //IF I DO THIS, I get error - expected unqualified id
       Compare<T> x; // cannot create instance of Compare

      // IF I DO THIS< I can create instance of Compare but cannot call function compare.
       Compare x;

       x.compare(....) -- Error no member named compare in std::less


}

我无法使CustomCompare::compare静态,因为我希望代码也适用于std :: less。

我希望问题很明确。

注意:我知道我可以为将要使用它的类重载operator <。如果这些类的源代码不可用,我正在为这种情况做准备

1 个答案:

答案 0 :(得分:1)

std::less具有以下功能来比较对象。

bool operator()( const T& lhs, const T& rhs ) const;

如果你想使用自定义比较类作为一个相同的替代品,你也必须在该类中有这样的功能。

然后,您将其用作:

  if (compare()(val->data , treeNode->data))