我理解这个概念,但我不知道为什么我需要使用非类型模板参数?
答案 0 :(得分:15)
有很多用例,所以让我们看一下它们不可或缺的几种情况:
固定大小的数组或matrix类,请参阅例如C ++ 11 std::array或boost::array。
数组的std::begin的可能实现,或任何需要固定大小C样式数组大小的代码,例如:
返回数组的大小:
template <typename T, unsigned int N>
unsigned int size(T const (&)[N])
{
return N;
}
它们在模板元编程中也非常有用。
答案 1 :(得分: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);
}
答案 2 :(得分:2)
在编译时编程。考虑WikiPedia示例
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
WikiPedia页面上有许多其他示例。
正如评论中所述,上面的示例演示了 可以做什么 ,而不是 人们在实际项目中使用 < /强>
答案 3 :(得分:0)
非类型参数的另一个例子是:
template <int N>
struct A
{
// Other fields.
int data[N];
};
这里数据字段的长度是参数化的。此结构的不同实例化可以具有不同的数组长度。