48673


テンプレートクラスで`template<class type,int N>`と`template<class type>`で  
`template<class type,int N>`の場合は配列がオブジェクトに含まれて  
`template<class type>`の場合は配列にオブジェクトに含まれないっていう参考書にあるのですがどういう意味なのでしょうか？

[code]

                //配列がオブジェクトに含まれる。
            template<class type,int N> class x {
                type vec[N] = { type() };
    
            public:
                x(){ }
    
            void print() {
                    int i = 0;
                    for(i; i<N; i++)
                    cout << vec[i]<<"\n";
                }
    
    
            int  size() { return N; }
    
            };
    
            //配列はオブジェクトに含まれない。
            template<class type> class y {
                int nelem;//要素数
                type *vec;//配列の先頭要素を指すポインタtype型
    
            public:
    
                y(int s = 0, type t = type()) :nelem(s) {
    
                    vec = new type[nelem];
                    vec = { type() };
    
                }
                void print() {
                    int i = 0;
                    for (i; i < nelem; i++)
                        cout << vec[i] << "\n";
                }
    
                int size() { return nelem; }
            };
    
[/code]


CC BY-SA 4.0
2018-09-23T15:52:50.430
48661
2018-09-24T06:26:16.560
question
c++
templateクラスで定数がある配列について


記載のコード例から察するに、`class x`は配列メンバを含んでいる、`class
y`は配列は含んでおらず、ポインタで配列の位置を指している、という違いから、そのように記載されているのではないかと予想します。

＃次のようなコード例で言うと、`sizeof(xArray)`は「40」(配列の要素の合計が計上される)になるのに対し、`sizeof(yArray)は16にしかならない(サイズを表す整数変数とポインタ変数)、という意味と予想します。  
(実際の結果は、環境によって変化します。差異が出る、という点を示しています)

[code]

    #include <iostream>
    
    // template<class type, int N> class x , template<class type y>
    // の定義は省略。
    
    int main() {
        // xArray, yArrayはどちらも10個の要素を持つ配列
        x<int, 10> xArray;
        y<int> yArray(10);
        // 出力は、それぞれ「40」(4×10)、「16」(8×2)と異なる値になる。
        std::cout << sizeof(xArray) << "\n";
        std::cout << sizeof(yArray) << "\n";
        return 0;
    }
    
[/code]

いかがでしょうか?


CC BY-SA 4.0
2018-09-24T04:51:10.060
48671
2018-09-24T04:51:10.060
20098
48661
answer


真に訊きたい質問が何か微妙にわかりませんが

テンプレート仮引数に `<int N>` のようなものを書いたとして、それだけで配列がとられることはありません。提示クラス前者は `type
vec[N];` なるメンバをきっちり作っているから「配列メンバがある」、後者は `type *vec;`
しかないから「配列」はなくてポインタメンバがあるだけです。

オイラのサンプル [c++
constexpr型指定子の使い方とconstとの使い分けの方法](https://ja.stackoverflow.com/questions/48369/)
でも `<int n>` なテンプレート仮引数を取っていますけど、配列なんぞありません。


CC BY-SA 4.0
2018-09-24T06:26:16.560
48673
2018-09-24T06:26:16.560
8589
48661
answer