将非平凡的项目放在多集中

putting non trivial items in a multiset

本文关键字:集中 项目      更新时间:2023-10-16

我有这个类(我正在制作一个任务调度程序(。这表示排队的项目。

class QueueItem
{
friend class TimerQueue;
std::chrono::system_clock::time_point when_;
std::packaged_task<void(void)> what_;
std::string name_;
public:
bool operator<(const QueueItem& other)
{
return when_ > other.when_;
}
};
using QueueItemP = std::shared_ptr<QueueItem>;

通常我永远不会放这样的东西是 STL 容器,我会一直使用shared_ptr<QI>. 但是我刚刚发现(duh(我的排序比较器(运算符<(在这里不起作用。这是因为 multiset 需要对shared_ptr<QueueItem>对象进行"<"。

我不知道该怎么办,我想我无法为shared_ptr<QI>实现"<"。所以我想我必须将真实对象存储在容器中。但我觉得我最终会进入移动、前进和裁判等的世界(我根本不明白,也许现在是学习的时候了(,因为我有那个std::packaged_task(我非常警惕滥用(

我的选择是什么。

为什么不能在shared_ptr上实现比较运算符?

(未经测试的代码(

struct Compare {
bool operator ()(const QueueItemP &lhs, 
const QueueItemP &rhs) const
{ return *lhs < *rhs; }
};
std::multiset<QueueItemP, Compare> m;

具体来说,std::set使用std::less作为默认比较函数。通常std::less要求operator<的两侧都是常量参考,但你的operator<的LHS没有标记为常量,所以std::less无法识别它。