文章主要参考官方文档:https://en.cppreference.com/w/cpp/language/template_parameters
Type template parameter
这是最基本的模板类型,也是最常用的:
template <typename T>
T foo(T t) {/*......*/}
template <class T = void> // 默认模板参数
class C {/*......*/};
template <typename... Ts> // 变长模板参数
class C1 {/*......*/}
关于变长模板,参考这篇博客:https://blog.csdn.net/qq_35976351/article/details/85019798
Template template parameter
顾名思义,这是模板的模板,举个简单例子:
template <template <typename> typename T1, typename T2>
struct Fun1_ {
using type = typename T1<T2>::type;
};
在这里,T1
相当于一个模板类型,需要再嵌套一个模板才可以。
再给出一个官网的例子:
template <typename T>
class My_Array {/*...*/};
template <typename K, typename V, template <typename> typename T = My_Array>
class Map {
C<K> Key;
C<V> Value;
/*...*/
};
Template arguments
这里相当于数值,而不再是不同的模板了,空间是再编译期间进行分配的。
用一个简单的例子说明:
template <int N>
struct Fn {
int a[N];
};
int main() {
Fn<10> fn
std::cout << sizeof(fn) << std::endl;
return 0;
}
输出结果:
40