使用函数指针的带有比较器的多集声明
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::multiset
有 a constructor(该页面上的构造函数 (1)),它接受将用于进行比较的比较器类型的对象。函数名可以隐式转换为指向该函数的指针,因此传递 compareA
等同于 &compareA
.
综上所述,m1
的比较器类型是“指向接受两个 A
的函数的指针”。您将指向 compareA
的指针传递给它的构造函数,然后它将使用它来调用 compareA
来进行它需要的比较。
这是此处提出和回答的问题的扩展: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::multiset
有 a constructor(该页面上的构造函数 (1)),它接受将用于进行比较的比较器类型的对象。函数名可以隐式转换为指向该函数的指针,因此传递 compareA
等同于 &compareA
.
综上所述,m1
的比较器类型是“指向接受两个 A
的函数的指针”。您将指向 compareA
的指针传递给它的构造函数,然后它将使用它来调用 compareA
来进行它需要的比较。