如何在 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++ 中是不可能的?
您需要为 int
、double
、char
等内置类型实现模板专业化。无法查询内置类型的关系运算符,这会导致您的代码失败。
在 int
上执行比较的 C++ 中没有预先存在的函数。此外,即使 Key
是 class 类型,您也无法知道它是否具有成员或非成员 operator<
.
这里有一些备选方案:
使用std::less
,
this->lessThan = std::less<Key>();
使用 lambda:
this->lessThan = [](const Key& k1, const Key& k2){ return k1 < k2; };
如果你像标准库容器一样设计AVLTree
,比较对象的类型应该是一个类型模板参数Comp
默认为std::less<Key>
,用在构造函数中传递的实例,默认为 Comp()
.
template<class Key, class Value>
AVLTree<Key,Value>::AVLTree()
{
this->lessThan = std::less<Key>();
}
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++ 中是不可能的?
您需要为 int
、double
、char
等内置类型实现模板专业化。无法查询内置类型的关系运算符,这会导致您的代码失败。
在 int
上执行比较的 C++ 中没有预先存在的函数。此外,即使 Key
是 class 类型,您也无法知道它是否具有成员或非成员 operator<
.
这里有一些备选方案:
使用
std::less
,this->lessThan = std::less<Key>();
使用 lambda:
this->lessThan = [](const Key& k1, const Key& k2){ return k1 < k2; };
如果你像标准库容器一样设计
AVLTree
,比较对象的类型应该是一个类型模板参数Comp
默认为std::less<Key>
,用在构造函数中传递的实例,默认为Comp()
.
template<class Key, class Value>
AVLTree<Key,Value>::AVLTree()
{
this->lessThan = std::less<Key>();
}