不工作:覆盖 class 的 shared_ptr 的默认小于运算符

Not working: override the default less-than operator of shared_ptr of a class

全部。我正在尝试使用 std::multiset 在插入时自动排序。它的元素是 std::shared_ptrDataCell 个对象。这是头文件中的代码:

#include <iostream>
#include <string>
#include <set>
#include <memory>

class DataCell
{
public:
    double _cartesianDistance;
};

typedef std::shared_ptr<DataCell> DataCellPtr;

bool operator<(const DataCellPtr &d1, const DataCellPtr &d2)  {
    std::cout << "lalala" << std::endl;
    return d1->_cartesianDistance < d2->_cartesianDistance;
}

typedef std::multiset<DataCellPtr, std::less<DataCellPtr>> DataCellPtrMultiset;

int main(){
    DataCellPtr d1( new DataCell );
    DataCellPtr d2( new DataCell );
    d1->_cartesianDistance = 1.0;
    d2->_cartesianDistance = 2.0;
    DataCellPtrMultiset dms;
    dms.insert( d1 );
    dms.insert( d2 );
}

预期输出:

lalala
lalala

一切正常,除了我的自定义排序没有发生,因为我应该将 "lalala"s 打印到我的 std::out,但没有发生。我想象多重集正在使用 shared_ptr 的默认顺序。 _cartesianDistance 成员是双重成员。问题:如何覆盖默认的 shared_ptr 排序?

不使用 std::less,只需提供您自己的比较器对象:

struct DataCellPtrComparison
{
  bool operator() (const DataCellPtr &d1, const DataCellPtr &d2) const {
    std::cout << "lalala" << std::endl;
    return d1->_cartesianDistance < d2->_cartesianDistance;
  }
};

typedef std::multiset<DataCellPtr, DataCellPtrComparison> DataCellPtrMultiset;

"Overriding" 您自己的命名空间中 std::shared_ptr 的现有 operator< 是不可能的,因为它已经在 namespace std 中定义并且可以通过 [=15 找到=] 在不同命名空间中具有相同签名的任何函数之前。