4

概念は理解していますが、型以外のテンプレート引数を使用する必要がある理由がわかりません。

4

4 に答える 4

15

多くのユースケースがあるので、それらが不可欠であるいくつかの状況を見てみましょう。

  • 固定サイズの配列または行列クラス。たとえば、C ++ 11 std::arrayまたはboost::arrayを参照してください。

  • 配列のstd::beginの可能な実装、または固定サイズのCスタイルの配列のサイズを必要とするコード(例:

配列のサイズを返します。

template <typename T, unsigned int N>
unsigned int size(T const (&)[N])
{
  return N;
}

また、テンプレートメタプログラミングでも非常に役立ちます。

于 2012-09-23T07:06:54.353 に答える
3

実際の例は、型以外のテンプレート引数とテンプレート引数の推定を組み合わせて、配列のサイズを推定することから得られます。

template <typename T, unsigned int N>
void print_array(T const (&arr)[N])       // both T and N are deduced
{
    std::cout << "[";
    for (unsigned int i = 0; i != N; ++i)
    {
        if (i != 0) { std::cout << ", ";
        std::cout << arr[i];
    }
    std::cout << "]";
}

int main()
{
    double x[] = { 1.5, -7.125, 0, std::sin(0.5) };
    print_array(x);
}
于 2012-09-23T08:05:57.847 に答える
2

コンパイル時にプログラムします。ウィキペディアの例を考えてみましょう。

template <int N>
struct Factorial {
    enum { value = N * Factorial<N - 1>::value };
};

template <>
struct Factorial<0> {
    enum { value = 1 };
};

// Factorial<4>::value == 24
// Factorial<0>::value == 1
const int x = Factorial<4>::value; // == 24
const int y = Factorial<0>::value; // == 1

ウィキペディアのページには他にもたくさんの例があります。

編集

コメントで述べたように、上記の例は、人々が実際のプロジェクトで使用するものではなく、何ができるかを示しています。

于 2012-09-23T07:06:22.933 に答える
0

非型引数の別の例は次のとおりです。

template <int N>
struct A
{
    // Other fields.
    int data[N];
};

ここでは、データフィールドの長さがパラメータ化されています。この構造体のインスタンス化が異なれば、配列の長さも異なります。

于 2012-09-23T09:07:01.757 に答える