为啥我不能将函数指针作为模板参数传递给地图?

Posted

技术标签:

【中文标题】为啥我不能将函数指针作为模板参数传递给地图?【英文标题】:Why can't I pass a function pointer as a template parameter to a map?为什么我不能将函数指针作为模板参数传递给地图? 【发布时间】:2018-10-07 03:16:47 【问题描述】:

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

#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 似乎暗示传递函数指针类型是完全有效的。我的代码有什么问题?

【问题讨论】:

typedef decltype(&amp;compareCustom) CustomComparator; @Swordfish 不只是在需要函数指针的地方给出函数会导致编译器将其视为函数指针吗? @john01dav 不,在某些情况下,函数名称可能会衰减为指向该函数的指针,但 decltype(functionName) 不是其中一种情况。 @MilesBudnek 那些案例是什么? @john01dav 这是一个隐式转换。如果您正在初始化或分配给函数指针,函数名称将衰减为一个指针来初始化它。这与数组衰减为指向其第一个元素的指针的方式非常相似。 【参考方案1】:

传递函数指针是有效的,但传递函数不是。

typedef decltype(compareCustom) CustomComparator;

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

你应该使用:

typedef decltype(compareCustom) *CustomComparator;

【讨论】:

以上是关于为啥我不能将函数指针作为模板参数传递给地图?的主要内容,如果未能解决你的问题,请参考以下文章

当我们将对象作为参数传递给方法时,为啥会调用复制构造函数?

将取消引用的指针作为函数参数传递给结构

将函数指针作为参数传递给 dll 函数并从 dll 内部调用它们是不是安全?

C将int数组指针作为参数传递给函数

如何通过原始指针将闭包作为参数传递给 C 函数?

如何将指针作为参数传递给 COM 对象中的函数?