使用public函数作为排序标准,C++;
Use public function as sorting criteria, C++;
考虑这个例子,我 public 少了一些我想用作比较器的功能。
P.S。我知道如果我将其更改为 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 作为比较器吗?
如果它不可能,你能告诉我任何解决方法而不触及 class 本身。
您可以在全局范围内声明一个小于运算符,它只会调用 less()
。这满足您不修改 class:
的标准
class A {
std::string str;
int id;
public:
virtual bool less(A const& rhs) const{
return id < rhs.id;
}
};
bool operator<(const A& lhs, const A& rhs) {
return lhs.less(rhs);
}
int main()
{
std::set<A> s;
}
如果您不想使用运算符<,则可以使用像这样处理同情心的包装器类型:
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;
}
这样做的好处是您不必将任何东西传递给构造函数,类型定义足以告诉它您自己比较的用法。
你可以定义一个比较器。
int main()
{
auto comp = [](const A& a, const A& b){return a.less(b);};
std::set<A,decltype(comp)> s{comp};
}
std::set
的第二个参数需要是类型,而不是值。
还必须是一种类型,其中 comp(a, a)
是有效表达式,其中 comp
是比较类型的值,a
是元素类型的值, 所以我们不能直接使用指向成员函数的指针。
std::set<A, decltype(std::mem_fn(&A::less))> s(std::mem_fn(&A::less)));
考虑这个例子,我 public 少了一些我想用作比较器的功能。
P.S。我知道如果我将其更改为 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 作为比较器吗?
如果它不可能,你能告诉我任何解决方法而不触及 class 本身。
您可以在全局范围内声明一个小于运算符,它只会调用 less()
。这满足您不修改 class:
class A {
std::string str;
int id;
public:
virtual bool less(A const& rhs) const{
return id < rhs.id;
}
};
bool operator<(const A& lhs, const A& rhs) {
return lhs.less(rhs);
}
int main()
{
std::set<A> s;
}
如果您不想使用运算符<,则可以使用像这样处理同情心的包装器类型:
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;
}
这样做的好处是您不必将任何东西传递给构造函数,类型定义足以告诉它您自己比较的用法。
你可以定义一个比较器。
int main()
{
auto comp = [](const A& a, const A& b){return a.less(b);};
std::set<A,decltype(comp)> s{comp};
}
std::set
的第二个参数需要是类型,而不是值。
还必须是一种类型,其中 comp(a, a)
是有效表达式,其中 comp
是比较类型的值,a
是元素类型的值, 所以我们不能直接使用指向成员函数的指针。
std::set<A, decltype(std::mem_fn(&A::less))> s(std::mem_fn(&A::less)));