【问题标题】:Multiset declaration with comparator using function pointers使用函数指针的带比较器的多集声明
【发布时间】:2020-10-29 14:31:48
【问题描述】:

这是对此处提问和回答的问题的扩展:How to define a multiset using a function pointer?

不幸的是,我没有足够的声誉以接受的答案向用户询问我的问题作为评论(还有 9 个问题......),所以我来了。希望这没问题。

在那个问题中,我也在研究 C++ Primer 并且达到了相同的部分。使用上面链接中给出的简化示例,我试图理解这一行:

std::multiset<A, decltype(compareA)*> m1(compareA);

据我所知,这是复制构造函数的语法。例如,将整数的多重集 m1 初始化为多重集 m2 的副本,写为 std::multiset<int> m1(m2);

那么当我们使用函数指针时,这里发生了什么?这只是语法糖来让decltype(compareA)*返回的函数指针类型指向compareA吗?我认为我从根本上误解了这条线在做什么。

作为旁注,我应该如何阅读std::multiset 上的文档才能回答这个问题?我觉得 C++ 文档比 Java 文档更难访问,但也许我只是找错地方了。

【问题讨论】:

    标签: c++ constructor function-pointers multiset


    【解决方案1】:

    std::multiset<A, decltype(compareA)*> m1(compareA) 行定义了一个名为m1、类型为std::multiset<A, decltype(compareA)*> 的对象,并将compareA 作为参数传递给它的构造函数。

    std::multiset 的第二个模板参数是要使用的比较器的类型。在本例中,即为decltype(compareA)*:指向compareA 类型的指针。可能类似于bool (*)(const A&, const A&):指向返回bool 并通过const 引用接受两个A 参数的函数的指针。该类型本身无法进行任何比较,您需要该类型的实际 object 指向特定函数。通常std::multiset 将值初始化其比较器类型的对象,但对于函数指针类型,它将是一个空指针。为了解决这个问题,std::multiset 具有 a constructor(该页面上的构造函数 (1)),它接受将用于进行比较的比较器类型的对象。函数名称可以隐式转换为指向该函数的指针,因此传递 compareA 等效于 &compareA

    综上所述,m1 的比较器类型是“指向接受两个 As 的函数的指针”。您将指向 compareA 的指针传递给其构造函数,然后它将使用该指针调用 compareA 以进行所需的比较。

    【讨论】:

    • 没有点击进入其构造函数的页面,我觉得非常愚蠢,我可以看到第一个构造函数引用了一个比较类型的引用,该类型带有分配器参数的默认参数(无论是什么)。现在一切都说得通了。谢谢您的回答! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 2018-10-21
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 2013-03-16
    相关资源
    最近更新 更多