模板概述
模板,有时称为 " 参数化类型,是基于类型和类结构的母函数参数。 通过使用模板,可以设计对许多类型的数据的单个类或函数,而不必为每种类型创建单独的类。
备注
例如,创建返回最小限度于两个参数,而不使用模板的 typesafe 请函数,则应编写设置如下的重载函数:
// what_are_templates1.cpp
// compile with: /c
// min for ints
int min( int a, int b ) {
return ( a < b ) ? a : b;
}
// min for longs
long min( long a, long b ) {
return ( a < b ) ? a : b;
}
// min for chars
char min( char a, char b ) {
return ( a < b ) ? a : b;
}
通过使用模板,可以使此副本减少到一个函数模板:
// what_are_templates2.cpp
// compile with: /c
template <class T> T min( T a, T b ) {
return ( a < b ) ? a : b;
}
模板可以显着减少源代码大小和提高代码的灵活性,而不会削弱类型安全。
具有模板的两种主要类型:函数模板和类模板。 在前面的示例中, min 是函数模板。 类模板是一个参数的类,例如:
// what_are_templates3.cpp
template <class T> class A {
T m_t;
public:
A(T t): m_t(t) {}
void f(T t);
};
int main() {
A<int> a(10);
}
模板声明和定义有些类似于其他功能和类,有一些主要差异。 模板声明不完全定义函数或类;它只定义类或函数的语法摘要。 实际类或函数从模板创建由调用实例化的过程。 创建的单个类或功能称为实例化。 例如,类模板:
template <class T> struct A { . . . };
可以使用实例化 A<int>的, A<char>, A<int*>, A<MyClass*>类,依此类推。
类或函数的实例化可以显式或隐式完成。 显式实例化是方式调用代码在模板的版本将生成。 隐式实例化允许模板实例化根据需要先使用它们的点。
,模板参数声明将该参数传递给函数情况下,模板可以按传值参数还参数化。 浮点类型和类类型不允许作为值参数。
// what_are_templates4.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
template <int i> class A {
int array[i];
public:
A() { memset(array, 0, i*sizeof(int)); }
};
int main() {
A<10> a;
}
模板的常见问题是它们可以是一个通用型解决方案,这意味着同一代码应用于所有类型。 如果需要自定义模板的行为特定类型的,则可以使用专用化。 使用显式专用化,模板可以为特定的实际类型,而不是泛型类型专用化。 类模板可以部分专用化,也很有用,如果您有多个类型以及仅要自定义的行为有关数组,而不是所有的参数的参数的模板。 部分专用化为泛型并且需要实际模板参数导致实际实例化的类。