如果您对std::priority_queue 的第二个模板参数的特定解决方案感兴趣,我想您可以以某种方式使用typename std::priority_queue<T>::container_type(例如,请参阅来自 nwp 的解决方案;+1)。
如果您对更通用的解决方案感兴趣(不仅适用于第二个默认模板类型,也不仅仅适用于 std::priority_queue),我想您可以先开发一个类型特征 type_n 以从列表
template <std::size_t N, typename T0, typename ... Ts>
struct type_n
{ using type = typename type_n<N-1U, Ts...>::type; };
template <typename T0, typename ... Ts>
struct type_n<0U, T0, Ts...>
{ using type = T0; };
下一个类型特征type_cnt_n(使用type_n)提取模板模板参数的第n个类型参数
template <std::size_t, typename>
struct type_cnt_n;
template <std::size_t N, template <typename ...> class Cnt, typename ... Ts>
struct type_cnt_n<N, Cnt<Ts...>>
{ using type = typename type_n<N, Ts...>::type; };
最后(根据 nwp 的回答)make_priority_queue() 函数
template <typename T, typename Cmp>
auto make_priority_queue (Cmp const & cmp)
{ return std::priority_queue<T,
typename type_cnt_n<1U, std::priority_queue<T>>::type, Cmp> { cmp }; }
此解决方案的问题在于,仅适用于带有仅类型模板参数的模板模板类型(因此适用于 std::priority_queue、std::vector、std::map,但不适用于 std::array) .
以下是一个完整的工作......好吧,一个完整的编译......示例
#include <queue>
#include <iostream>
template <std::size_t N, typename T0, typename ... Ts>
struct type_n
{ using type = typename type_n<N-1U, Ts...>::type; };
template <typename T0, typename ... Ts>
struct type_n<0U, T0, Ts...>
{ using type = T0; };
template <std::size_t, typename>
struct type_cnt_n;
template <std::size_t N, template <typename ...> class Cnt, typename ... Ts>
struct type_cnt_n<N, Cnt<Ts...>>
{ using type = typename type_n<N, Ts...>::type; };
template <typename T, typename Cmp>
auto make_priority_queue (Cmp const & cmp)
{ return std::priority_queue<T,
typename type_cnt_n<1U, std::priority_queue<T>>::type, Cmp> { cmp }; }
int main()
{
auto cmpFn = [](std::string const & l, std::string const &r)
{ return r < l; };
auto pq = make_priority_queue<std::string>(cmpFn);
}