2

配列内の要素の数を見つけるために使用される手法について学んでいます (配列の長さをパラメーターとして渡す必要なく、並べ替えアルゴリズムの作成を開始できることを願っています) が、チュートリアルでは、これは次の行がテンプレート宣言として表示されます。

template <typename T, size_t N>

正直なところ、1 つのテンプレート宣言で複数の型名を宣言できるとは知りませんでしたが、さらに "size_t N" は何をするのでしょうか? これもテンプレート宣言内の変数宣言ですか?

4

2 に答える 2

7

size_tに似ているタイプですunsigned int。テンプレートパラメータにそれを含めることはsize_t、型ではなく を渡すことを意味します。Nおそらく、符号なしの値である配列のサイズを表します。例えば:

template<typename T, size_t N>
void zeroArray(T (&arr)[N]) {    //arr is a reference to an array 
    std::fill(arr, arr + N, 0);  //of N elements of type T
}

int main() {
    int arr[3];
    zeroArray<int, 3>(arr);
}

例では、次のように言えます。

zeroArray(arr);

両方のテンプレート引数が推定されるためです。

于 2012-11-06T20:38:09.767 に答える
2

"size_t N" は何をしますか? これもテンプレート宣言内の変数宣言ですか?

ええ、基本的に。

テンプレート引数は、整数型の型または値の場合があります。他にもいくつかありますが (「参考文献」を参照)、それ自体[C++11: 14.3.2/1]を「変数」とは呼びませんが、...

とにかく、値も型と同じように推測できるので、次のようになります。

template <typename T, size_t N>
size_t array_size(const T (&)[N])
{
    return N;
}

int main()
{
   int  x[5];
   char y[10];
   std::string z[20];

   std::cout << array_size(x) << ',' << array_size(y) << ',' << array_size(z) << '\n';
}

出力: 5,10,20.

完全に有効です。

于 2012-11-06T20:40:00.527 に答える