为什么不能将函数指针作为临时参数传递给映射?

时间:2018-10-07 03:16:47

标签: c++ templates stl function-pointers

我当前正在开发程序,并且想将函数指针传递给自定义比较器的映射。但是,在下面的至少一个可验证的示例中,这会产生错误:

#include <iostream>
#include <map>

struct CustomKey{
    unsigned a;
};

bool compareCustom(const CustomKey &a, const CustomKey &b){
    return a.a < b.a;
}

typedef decltype(compareCustom) CustomComparator;

int main(){
    std::map<CustomKey, unsigned, CustomComparator> customMap(&compareCustom);
    return 0;
}

使用GCC或Clang编译上述代码会产生大量无用的模板错误,完全以std::map的内部实现为中心。 This question似乎建议传递函数指针类型是完全有效的。我的代码有什么问题?

1 个答案:

答案 0 :(得分:3)

传递函数指针有效,但传递函数无效。

typedef decltype(compareCustom) CustomComparator;

实际上使CustomComparator的类型为bool(const CustomKey&, const CustomKey&),这就是函数本身,而不是指针。

您应该使用:

typedef decltype(compareCustom) *CustomComparator;