如何在 C++ 中将 std::function 分配给运算符?

How do I assign an std::function to an operator in C++?

template<class Key, class Value>
AVLTree<Key,Value>::AVLTree(){
    this->lessThan = Key::operator<;
}

默认情况下,此代码应该使 std::function<bool(Key, Key)> lessThan 字段等于键的 < 运算符。但是,当我使用 AVLTree<int,int> 尝试此操作时,我得到:

error: ‘operator<’ is not a member of ‘int’

我的格式是否错误,或者这在 C++ 中是不可能的?

您需要为 intdoublechar 等内置类型实现模板专业化。无法查询内置类型的关系运算符,这会导致您的代码失败。

int 上执行比较的 C++ 中没有预先存在的函数。此外,即使 Key 是 class 类型,您也无法知道它是否具有成员或非成员 operator<.

这里有一些备选方案:

  1. 使用std::less,

    this->lessThan = std::less<Key>();
    
  2. 使用 lambda:

    this->lessThan = [](const Key& k1, const Key& k2){ return k1 < k2; };
    
  3. 如果你像标准库容器一样设计AVLTree,比较对象的类型应该是一个类型模板参数Comp默认为std::less<Key>,用在构造函数中传递的实例,默认为 Comp().

template<class Key, class Value>
AVLTree<Key,Value>::AVLTree()
{
    this->lessThan = std::less<Key>();
}

http://en.cppreference.com/w/cpp/utility/functional/less