概念は理解していますが、型以外のテンプレート引数を使用する必要がある理由がわかりません。
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 に答える