模板声明的两种形式:template<int N> 和 template<N>
template<int N>
:非类型模板参数
template<int N>
是一个典型的非类型模板参数的例子。这里的 N
是模板的参数,但它不是一个类型,而是一个具体的整数值。这意味着,当你实例化模板时,你必须为 N
提供一个常量整数值。
示例:
template<int N>
struct Array { int data[N]; // 创建一个大小为 N 的数组 };
int main() { Array<5> arr; // N = 5,创建一个大小为 5 的数组 }
在这个例子中,N
是一个模板参数,它必须是一个整数。模板实例化时,N
的值会被替换到模板定义中。
特点:
template<int N>
中的N
是一个非类型模板参数,表示一个常量值,比如整数、指针或枚举值。- 编译时必须提供一个常量来实例化模板。
2. template<N>
:占位符,需结合类型声明
template<N>
本身是不完整的,不能单独使用。N
在这种情况下代表一个类型占位符,但需要你用 typename
或 class
来修饰它以表示它是一个类型参数。
示例(typename
用法):
template<typename N>
struct Wrapper {
N value; // N 是一个类型
};
int main() {
Wrapper<int> w; // N 是 int 类型
w.value = 10;
}
这里的 N
代表一个类型占位符,模板实例化时,你需要为 N
提供一个具体的类型,例如 int
、float
等。
示例(class
用法):
template<class N>
struct Wrapper {
N value; // N 是一个类型
};
int main() {
Wrapper<double> w; // N 是 double 类型
w.value = 3.14;
}
在 C++ 中,typename
和 class
可以互换使用来声明类型模板参数。
特点:
template<N>
中的N
必须用typename
或class
来声明为一个类型参数。N
在模板中表示一个类型,而不是具体的值。
总结:
template<int N>
:用于非类型模板参数,N
必须是一个常量(例如整数、枚举、指针等),实例化时需要传递一个具体的值。template<N>
:表示一个类型模板参数,但它必须用typename
或class
修饰,N
代表一个类型,实例化时需要传递一个具体的类型。
因此,template<int N>
和 template<N>
的区别在于,前者用来接收常量值,后者用来接收类型,且后者需要额外的关键字修饰。