假设有一个以指针为键的地图。要进行底层对象的深度比较,可以按以下方式编写自定义比较器:
但是它并没有解释为什么默认情况下不使用精确签名。
#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);
}
但是它并没有解释为什么默认情况下不使用精确签名。