使用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)));