简介
泛型编程与面向对象编程一样,都依赖于某种形式的多态性,在C++中,模板是泛型编程的基础。
目的
使用泛型类型与泛型函数
正文
定义函数模板
template<class T> int compare(const T &t1, const T &t2) { if(t1 < t2) return -1; if(t2 < t1) return 1; return 0; }
|
使用函数模板
cout << compare(1, 0) << endl; cout << compare<int>(1, 0) << endl
|
inline函数模板
inline template<class T> T min(const T &, const T &)
|
非类型模板形参,模板形参不必都是类型,在调用函数时非类型形参将用值代替,值的类型在模板形参表中指定
template<class T, size_t N> void array_init(T (¶m)[N]) { for(size_t i = 0; i != N; i++) param[i] = 0; }
|
使用
int x[42]; double y[10]; array_init(x);//array_init(int(&)[42])
array_init(y);//array_init(int (&)[10])
|
实例化:产生模板特定类型实例的过程成为实例化,在实例化类模板时,模板形参是必须。
模板编程模型
注意:当编译器看到模板定义的时候,它不立即产生代码,只有在看到需要用到模板时,编译器才产生特定类型的模板实例。模板要进行实例化,编译器必须能够访问定义模板的源代码,当调用函数模板或类模板的成员函数的时候,编译器需要函数定义,需要那些通常放在源文件中的代码。
模板特化
问题引入:
template<class T> int compare(const T &v1, const T & v2) { if(v1 < v2) return -1; if(v2 < v1) return 1; return 0; }
|
如果用两个const char *实参调用这个模板定义,函数将比较指针值,它将告诉我们这两个指针在内存中的相对位置,但没有说明与指针所指数组的内容有关的任何事情。
解决问题:
函数模板的特化
template<> int compare<const char *>(const char * const & v1, const char * const & v2) { return strcmp(v1, v2); }
|
在这个例子中,模板有一个类型形参和两个函数形参,函数形参是类型形参的const引用,在这里,将类型形参定为const char *.