这就是我所拥有的:
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函数使用.有没有办法实现这个目标?
如果你想通过它们的指数进行比较,你将不得不写一个比较器来检查它们的指数.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比较.
| 归档时间: |
|
| 查看次数: |
393 次 |
| 最近记录: |