あなたがstd::priority_queue
の2番目のテンプレートパラメータの特定のソリューションに興味があるなら、私はあなたには、いくつかの方法でtypename std::priority_queue<T>::container_type
を使用することができたとし(例で、参照、NWPから溶液; 1)。
より一般的なソリューションにご興味のある方(非のみ二デフォルトのテンプレートタイプのため、唯一のstd::priority_queue
用以外)、私はあなたが最初のリストからn番目のタイプをestractする型特性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
)
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から回答以下)テンプレートテンプレートパラメータのn番目の型引数を抽出しますこのソリューションの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::map
で、std::vector
で、std::priority_queue
で動作しますが、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);
}
ないが、確かにそれはないだろう、生きたと思われるテンプレートの別名? – WhozCraig