不工作:覆盖 class 的 shared_ptr 的默认小于运算符
Not working: override the default less-than operator of shared_ptr of a class
全部。我正在尝试使用 std::multiset
在插入时自动排序。它的元素是 std::shared_ptr
到 DataCell
个对象。这是头文件中的代码:
#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 找到=] 在不同命名空间中具有相同签名的任何函数之前。
全部。我正在尝试使用 std::multiset
在插入时自动排序。它的元素是 std::shared_ptr
到 DataCell
个对象。这是头文件中的代码:
#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 找到=] 在不同命名空间中具有相同签名的任何函数之前。