修改shared_ptr上的std :: less

Chr*_*ger 1 c++ stl c++11

这就是我所拥有的:

struct Foo {
  int index;
}
std::set<std::shared_ptr<Foo>> bar;
Run Code Online (Sandbox Code Playgroud)

我想bar通过它们的索引来命令元素,而不是通过std::less<std::shared_ptr<T>>与指针相关的默认函数来命令它们.

我读过我可以输入std::set<std::shared_ptr<Foo>, std::owner_less<std::shared_ptr<Foo>>> bar,但我更喜欢坚持以前的语法.

我试过定义std::less<std::shared_ptr<Foo>>,但它实际上并没有被set函数使用.有没有办法实现这个目标?

Bar*_*rry 8

如果你想通过它们的指数进行比较,你将不得不写一个比较器来检查它们的指数.std::less<>会做错事(因为它不会知道index)并且std::owner_less<>会做错事(因为它仍然不会比较Foos,而是与它们的所有权语义有关).

你必须写:

struct SharedFooComparator {
    bool operator()(const std::shared_ptr<Foo>& lhs,
                    const std::shared_ptr<Foo>& rhs) const
    {
        return lhs->index < rhs->index;
    }
};
Run Code Online (Sandbox Code Playgroud)

并使用它:

std::set<std::shared_ptr<Foo>, SharedFooComparator> bar;
Run Code Online (Sandbox Code Playgroud)

您还可以将其概括为shared_ptr的通用比较器:

struct SharedComparator {
    template <typename T>
    bool operator()(const std::shared_ptr<T>& lhs,
                    const std::shared_ptr<T>& rhs) const
    {
        return (*lhs) < (*rhs);
    }
};
Run Code Online (Sandbox Code Playgroud)

然后简单地进行Foo比较.