Generate
はstd::make_index_sequence
と非常によく似ています。おそらく、実装を検索することができます。
楽しみのためだけに、私は(簡単だが実際には効率的ではありません)
#include <type_traits>
template <int ...>
struct IntList
{ };
template <int N, int ... Next>
struct Generate : public Generate<N-1, N-1, Next...>
{ };
template <int ... Next>
struct Generate<0, Next ... >
{ using type = IntList<Next ... >; };
int main()
{
static_assert(std::is_same<Generate<5>::type,
IntList<0, 1, 2, 3, 4>>{}, "!");
}
より良いアプローチ(しかし、そう単純ではない)は、次の(対数)することができ、次の線形的なアプローチを提案
template <int...>
struct IntList
{ };
template <typename, typename>
struct ConcatLists;
template <int ... S1, int ... S2>
struct ConcatLists<IntList<S1...>, IntList<S2...>>
{ using type = IntList<S1..., (sizeof...(S1)+S2)...>; };
template <int N>
struct Generate
{ using type = typename ConcatLists<
typename Generate<(N>>1)>::type,
typename Generate<N-(N>>1)>::type>::type; };
template<>
struct Generate<0>
{ using type = IntList<>; };
template<>
struct Generate<1>
{ using type = IntList<0>; };
int main()
{
static_assert(std::is_same<Generate<5>::type,
IntList<0, 1, 2, 3, 4>>{}, "!");
}
- EDIT -
OPが
を尋ねます
ありがとうございます。最初の例がどのように機能するか説明してください。私は、この行がどのように機能するかを理解していない:template <int N, int ... Next> struct Generate : public Generate<N-1, N-1, Next...> { };
私はそれを理解する最良の方法はGenerate<5>
から、Inlist<0, 1, 2, 3, 4>
にもたらす、という連鎖を次のだと思います。
Generate<5>
(5
そうGenerate
の唯一の主なバージョンが適用可能である0
異なる)継承(N
が5
あり; Next...
が空である)Generate<4, 4>
から。
Generate<4, 4>
継承(4
は0
は異なる)(N
が5
あり; Next...
が4
ある)Generate<3, 3, 4>
から。
今や明らかになるはずです。
Generate<3, 3, 4>
を継承するGenerate<2, 2, 3, 4>
。
Generate<2, 2, 3, 4>
Generate<1, 1, 2, 3, 4>
を継承します。
Generate<1, 1, 2, 3, 4>
Generate<0, 0, 1, 2, 3, 4>
を継承します。
今すぐN
はゼロです。 IntList<0, 1, 2, 3, 4>
として定義type
含まGenerate<0, 0, 1, 2, 3, 4>
からGenerate<5>
継承:だからGenerate
試合の両方のバージョンが、部分的な特殊化(struct Generate<0, Next ... >
は)我々は
struct Generate<0, 0, 1, 2, 3, 4>
{ using type = IntList<0, 1, 2, 3, 4>; };
結論を持っている(Next...
が0, 1, 2, 3, 4
である)、より特化され、使用されるものとします。
何を試しましたか?何がうまくいかない? – Barry
@バリー私は何をする必要があるのか理解していないので、あまり試してみませんでした。 – user1786089