代码改变世界

《c++ prime》读书笔记--模板与泛型编程

2010-11-13 17:32  htc开发  阅读(232)  评论(0编辑  收藏  举报

 简介
  泛型编程与面向对象编程一样,都依赖于某种形式的多态性,在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((&param)[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 *.