C++ 使用非标准签名定义自定义映射比较器

C++ 使用非标准签名定义自定义映射比较器,c++,c++11,C++,C++11,假设存在一个以指针作为键的映射。要深入比较下划线对象,可以按以下方式编写自定义比较器: #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>

假设存在一个以指针作为键的映射。要深入比较下划线对象,可以按以下方式编写自定义比较器:

#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);
}
#包括
#包括
bool比较(标准::唯一的ptr lhs,标准::唯一的ptr rhs){

return*lhs比较器的类型根本不是由键的类型决定的。比较器不必是函数,它可以是一个类重载
运算符()

事实上,第三个模板参数有一个默认参数,它是这样一个类的实例化,即
std::less
。也就是说,
std::map
std::map

为什么不可能按照以下方式创建地图,因为它的签名应该是已知的

但它不是唯一已知的。该函数是至少两种类型映射的有效初始值设定项

std::map<std::unique_ptr<int>, short, bool (*)(std::unique_ptr<int>, std::unique_ptr<int>)>
std::map<std::unique_ptr<int>, short, bool (&)(std::unique_ptr<int>, std::unique_ptr<int>)>
#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);
}
std::map<std::unique_ptr<int>, short, bool (*)(std::unique_ptr<int>, std::unique_ptr<int>)>
std::map<std::unique_ptr<int>, short, bool (&)(std::unique_ptr<int>, std::unique_ptr<int>)>
struct compare {
    bool operator()(std::unique_ptr<int> lhs, std::unique_ptr<int> rhs){
        return *lhs<*rhs;
    }
};

std::map<std::unique_ptr<int>, short, compare> elements;