template<class In, template<class...>class Map>
struct template_map;
template<class In, template<class...>class Map>
using template_map_t=typename template_map<In, Map>::type;
template<template<class...>class Z, class...Ts, template<class...>class Map>
struct template_map<Z<Ts...>, Map> {
using type=Z<Map<Ts>...>;
};
を
これは、型よりも型である型と、型マップであるndは、囲まれた型をマップでマップした後に型を返します。
template<typename TypesTuple>
struct Bar {
template_map_t<TypesTuple, std::priority_queue> queues;
};
using Foo = Bar<std::tuple<int, double>>;
書き込みtemplate_map_t
は多くの方法で実行できます。
私はそれを助言するものではありませだろうが、ここでは花 - スタイルです:
template<class T>struct tag_t{ constexpr tag_t() {}; using type=T; };
template<class T>constexpr tag_t<T> tag{};
template<template<class...>class Z>
struct ztemplate_t{
constexpr ztemplate_t() {};
template<class...Ts>using apply=Z<Ts...>;
};
template<template<class...>class Z>
constexpr ztemplate_t<Z> ztemplate{};
これらは、それぞれのタイプやテンプレートを保存constexprの値です。
template<class Z, class...Ts>
constexpr auto zapply(Z, tag_t<Ts>...)
-> tag_t< typename Z::template apply<Ts...> >
{ return {}; }
zapply
ここで値を使用してテンプレートをタイプに適用できるようにします。
template<template<class...>class Z, class...Ts, class zM>
constexpr auto zmap(tag_t<Z<Ts...>>, zM)
{ return zapply(ztemplate<Z>, zapply(zM{}, tag<Ts>)...); }
およびタイプを抽出:
現在、マップ関数を書くことができ
template<class Tag>using type_t=typename Tag::type;
template<typename TypesTuple>
struct Bar {
using queues_t = type_t<decltype(
zmap(tag<TypesTuple>, ztemplate<std::priority_queue>)
)>;
queues_t queues;
};
テストコードで:タイプマップを示す
using Foo = Bar<std::tuple<int, double>>;
tag_t< std::tuple< std::priority_queue<int>, std::priority_queue<double> > > test = tag< decltype(std::declval<Foo&>().queues) >;
が働きました。
Live example。
質問には意味がありません。 'tuple'が与えられたら、 'tuple >'が必要だと言っているでしょう。それは事ではない。または、 'tuple 、priority_queue >'が必要ですか?または 'priority_queue >'? –
Barry
あなたは何をしようとしていますか?これらは奇妙に思える。 –
異種の優先順位キューを作成したいと思います。 – user3612643