📜  C++中的模板非类型参数(1)

📅  最后修改于: 2023-12-03 15:29:54.545000             🧑  作者: Mango

C++中的模板非类型参数

C++中的模板非类型参数是一种非常强大的技术,在模板的实例化过程中,可以为模板参数提供一些非类型的值,包括整数、指针和枚举等。

语法

非类型参数可以在函数和类模板中定义,其语法如下:

template <typename T, int N> // 定义一个模板,其中有一个非类型参数N
class MyClass {
public:
    void func() {
        // 使用非类型参数N
    }
};

template <int N>
void foo() {
    // 使用非类型参数N
}

int main() {
    MyClass<int, 10> myObj; // 实例化一个MyClass对象,其中N被设为10
    foo<20>(); // 调用foo函数,其中N被设为20
    return 0;
}
特点
  • 静态分配:非类型参数是在编译时就分配好的,而非在运行时动态分配。
  • 常量表达式:非类型参数必须是常量表达式,不能是变量、动态分配的内存等,因为编译器需要在编译时就确定它们的值。
  • 作用域:和其他类型的参数一样,非类型参数的作用域和所在的函数或类模板作用域相同。
  • 传递方式:在调用函数或实例化类模板时,需要为非类型参数提供一个值,可以是一个常量,也可以是一个常量表达式。对于类模板,这些参数可以被传递给类的构造函数。
  • 使用场景:非类型参数常常用于模板元编程,例如常量表达式的计算、模板特化等场合。
示例

以下是一个简单示例,演示了如何利用模板非类型参数求一个整数的平方:

#include <iostream>
using namespace std;

template <int N>
struct Square {
    enum { value = N*N };
};

int main() {
    cout << Square<5>::value << endl; // 输出25
    return 0;
}

在这个示例程序中,我们定义了一个模板结构体Square,其中有一个非类型参数N,它的值在编译时被确定为5。在这个结构体中,我们使用了enum来定义了一个常量value,该常量的值为N*N,即5*5=25。在main函数中,我们实例化了一个Square模板,并输出了其value成员的值。