使用函数指针的带有比较器的多集声明

Multiset declaration with comparator using function pointers

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

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

和那个问题一样,我也在学习 C++ Primer 并完成了同一部分。使用上面 link 中给出的简化示例,我试图理解这一行:

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

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

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

附带说明一下,我要如何阅读 std::multiset 上的文档才能回答这个问题?我觉得 C++ 文档比 Java 文档更难访问,但也许我只是找错了地方。

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

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

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