4

我理解这个概念,但我不知道为什么我需要使用非类型模板参数?

4

4 回答 4

15

有很多用例,所以让我们看一下它们必不可少的几种情况:

返回数组的大小:

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

WikiPedia 页面上还有许多其他示例。

编辑

正如评论中提到的,上面的示例演示了可以做什么,而不是人们在实际项目中使用什么

于 2012-09-23T07:06:22.933 回答
0

非类型参数的另一个例子是:

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

这里数据字段的长度是参数化的。此结构的不同实例化可以具有不同长度的数组。

于 2012-09-23T09:07:01.757 回答