【发布时间】:2019-12-14 22:24:09
【问题描述】:
假设有一个以指针为键的映射。要深入比较底层对象,可以通过以下方式编写自定义比较器:
#include <map>
#include <memory>
bool compare(std::unique_ptr<int> lhs, std::unique_ptr<int> rhs){
return *lhs<*rhs;
}
int main(){
std::map<std::unique_ptr<int>, short, bool (*)(std::unique_ptr<int>, std::unique_ptr<int>)> elements(compare);
}
这是无法理解的,但是为什么我需要显式传递比较回调的类型,因为它是由映射键的类型强加的?为什么不可能通过以下方式创建地图,因为它的签名应该是已知的:
std::map<std::unique_ptr<int>, short> elements(compare);
是否有需要定义不同签名的比较函数的情况?
编辑:
我想我已经回答了自己的最后一个问题。在某些时候我可以写这样的东西:
#include <map>
#include <memory>
bool compare(std::unique_ptr<BaseClass> lhs, std::unique_ptr<BaseClass> rhs){
return *lhs<*rhs;
}
int main(){
std::map<std::unique_ptr<DerivedClass>, short, bool (*)(std::unique_ptr<BaseClass>, std::unique_ptr<BaseClass>)> elements(compare);
}
但它没有解释为什么默认情况下不使用精确签名。
【问题讨论】: