2017-11-22 4 views
0

私はコンパイル時の配列を取得したいので、this answerに来てください。以下はその答えからコードです:struct gens : gens<N-1, N-1, S...>の構文が何であるかをメタプログラミングに関するいくつかの質問?

  1. #include <array> 
    #include <algorithm> 
    #include <iterator> 
    #include <iostream> 
    
    template<int ...> 
    struct seq { }; 
    
    template<int N, int ...S> 
    struct gens : gens<N-1, N-1, S...> { }; 
    
    template<int ...S> 
    struct gens<0, S...> { 
        typedef seq<S...> type; 
    }; 
    
    constexpr int f(int n) { 
        return n; 
    } 
    
    template <int N> 
    class array_thinger { 
        typedef typename gens<N>::type list; 
    
        template <int ...S> 
        static constexpr std::array<int,N> make_arr(seq<S...>) { 
        return std::array<int,N>{{f(S)...}}; 
        } 
    public: 
        static constexpr std::array<int,N> arr = make_arr(list()); 
    }; 
    
    template <int N> 
    constexpr std::array<int,N> array_thinger<N>::arr; 
    
    int main() { 
        std::copy(begin(array_thinger<10>::arr), end(array_thinger<10>::arr), 
          std::ostream_iterator<int>(std::cout, "\n")); 
    } 
    

    しかし、私はそうここに、メタプログラミングのための初心者です二つの質問がありますか? C++ 0xのDelegating constructorsのようですが、わかりません。

  2. struct seqtypedef seq<S...> typeの使用方法は?ああ、私もテンプレートの良いコマンドがありません。
+1

** 1 **それは継承です。 'gens 'は 'gens ' ** 2から派生したものです。**普通の 'typedef'です。 'type'という名前は' seq ' –

+0

のエイリアスとして宣言されています。整数シーケンスのより複雑な実装です。分割と征服による再帰です。大きなインスタンス化の深さを避けるために使用されます。 –

+0

もっと簡単な例については、[this](https://stackoverflow.com/a/27125297/4832499)を参照してください。 –

答えて

1

あなたが持っているものは、再帰的に自己を呼び出すテンプレートです。

あなたが書く場合:それはそのNのために、あなたのテンプレート

template<int N, int ...S> 
struct gens : gens<N-1, N-1, S...> { }; 

を使用しています

gens<3>::type 

3になり、Sのパラメータはnoneです。テンプレート構造体自体はgens<N-1, N-1, S...>から派生し、ここではgens<2,2>となります。これは再び(再帰的な)自体を呼び出すでしょう。

したがって、N = 2でGensテンプレートが呼び出され、Sは1つの要素が1つのint:2を含むリストです。これは `gens < 1,1,2>で今度はgensを呼び出します。 Nまで繰り返し

は理由氏族の専門の、今すぐ0になる:

template<int ...S> 
    struct gens<0, S...> { 
    typedef seq<S...> type; 
}; 

この分業が呼び出されます。だからここでゲンスが得られる< 0,0,1,2>。したがって、Nは0であり、Sは0,1,2のリストである。テンプレートでは、typeというタイプが生成されます。タイプは今すぐseq < 0,1,2>です。

gensは再帰的に派生するので、0の特殊化は構造体のルートであるため、その継承のシーケンスから型を取得できます。

だから、あなたが書くことができます。

gens<3>::type 

です。seq<0,1,2>

関連する問題