我有一个自定义类二进制搜索树。我想传递一个比较器类作为参数(默认为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 <
。如果这些类的源代码不可用,我正在为这种情况做准备
答案 0 :(得分:1)
std::less
具有以下功能来比较对象。
bool operator()( const T& lhs, const T& rhs ) const;
如果你想使用自定义比较类作为一个相同的替代品,你也必须在该类中有这样的功能。
然后,您将其用作:
if (compare()(val->data , treeNode->data))