使用公共函数作为排序标准,C++;
考虑这个例子,我有较少的公共函数,我想用作比较器。
PS我知道如果我改变operator<它会起作用。
class A {
std::string str;
int id;
public:
virtual bool less(A const& rhs) const{
return id < rhs.id;
}
};
int main()
{
std::set<A, A::less> s;
}
这给了我一个错误,即 less 不是有效的模板。
任何人都可以帮我通过 las 作为比较器吗?如果它不可能,你能告诉我任何解决方法而不触及班级本身。
回答
如果您不想使用 operator< ,那么您可以使用一个包装器类型来处理这样的同情心:
class A {
std::string str;
int id;
public:
virtual bool less(A const& rhs) const{
return id < rhs.id;
}
};
struct A_wrapped{
bool operator()(const A&a, const A&b) {
return a.less(b);
}
}
int main()
{
std::set<A, A_wrapped> s;
}
这样做的好处是您不必向构造函数传递任何内容,类型定义足以告诉它您自己比较的用法。
回答
的第二个参数std::set需要是一个类型,而不是一个值。
它也必须是一个类型,其中comp(a, a)是一个有效的表达式,其中comp是比较类型a的值,是元素类型的值,所以我们不能直接使用指向成员函数的指针。
std::set<A, decltype(std::mem_fn(&A::less))> s(std::mem_fn(&A::less)));