我有一个简单的MyElement
类,我想使用 abool MyElement::SomeMethod(...) {...}
作为项目的自定义比较std::set
器MyElement
。
我已经进行了研究,并且已经知道了一些替代解决方案,我在下面列出了这些解决方案。我也知道如何更改,例如,比较器用std::greater
而不是默认值std::less
,代码如下:
std::set<MyElement, std::greater<MyElement> > s;
我的确切问题是我想bool MyElement::SomeMethod(...) {...}
用作自定义比较器。我想出的唯一解决方案类似于下面列表中的最后一个,即布尔函数的解决方案:
using Cmp = std::integral_constant<decltype(&MyElement::SomeMethod),
&MyElement::SomeMethod>;
std::set<MyElement, Cmp> my_set;
但是,此解决方案仅适用于 a static
MyElement::SomeMethod
。
我想知道非静态方法是否有类似的或更简洁的方法。
替代解决方案列表:
C++20 的方法
auto cmp = [](const MyElement& lhs, const MyElement& rhs) { return ... };
std::set<MyElement, decltype(cmp)> s;
C++11 的方法
auto cmp = [](const MyElement& lhs, const MyElement& rhs) { return ... };
std::set<MyElement, decltype(cmp)> s(cmp);
函数而不是 lambda
bool cmp(const MyElement& lhs, const MyElement& rhs) { return ...; }
接着
std::set<MyElement, decltype(cmp)*> s(cmp);
或者
std::set<int, decltype(&cmp)> s(&cmp);
结构和运算符()
struct cmp {
bool operator() (const MyElement& lhs, const MyElement& rhs) const {
return ...
}
};
接着
std::set<MyElement, cmp> s;
布尔函数
bool cmp(const MyElement& lhs, const MyElement& rhs) {
return ...;
}
接着
#include <type_traits>
using Cmp = std::integral_constant<decltype(&cmp), &cmp>;
std::set<MyElement, Cmp> s;