模板与泛型 —— 定义与使用

一、概述
  1. 泛型编程是以独立于任何特定类型的方式编写代码。 使用泛型编程时,需要提供具体程序实例所操作的类习惯或者值。
  2. 模板是泛型编程的基础,模板是创建类或者函数的蓝图或者公式,通过给定蓝图或者公式足够信息,将其真正的转变成具体的类或者函数。这种转变通常发生在编译时。
  3. 模板支持将类型作为参数的程序设计方式,从而实现对泛型程序设计的直接支持。(在定义类、函数时,将类型作为参数)
二、函数模板
  1. 函数模板的定义
template<typename T>
T Add(T val1, T val2)
{
    T res = val1 + val2;
    return res;
}

<>里面是 模板参数列表(模板实参),<>里面至少需要一个模板参数。

  1. 函数模板的使用
    调用函数模板时,编译器会根据调用函数模板时的实参 去 推断模板参数列表内的参数(形参)类型。当编译器光凭借函数实参推断不出模板参数时,需要用<>主动提供模板参数。
// 编译器通过调用的实参,推断模板形参类型为 int
int res = Add(1, 2);

// 编译器在推断出模板的形参类型后,实例化了一个特定版本的函数,相当于:
int Add(int val1, int val2)
{
    int res = val1 + val2;
    return res;
}
  1. 非类型模板参数
    用typename/class 声明的参数,为类型参数。在模板参数列表内,还可以定义非类型参数。非类型参数代表一个数值。非类型参数需要用具体的类型名来声明非类型参数。
// 非类型模板参数定义
template<int S1, int S2>
int Add()
{
    int res = S1 + S2;
    return res;
}

// 非类型模板参数的调用
// 显式指定模板参数
int res = Add<1, 2>();
template<int L1, int L2>
int charscmp(const char(&p1)[L1], const char(&p2)[L2])
{
    return strcmp(p1, p2);
}

// 编译器推断非类型模板参数的值为传入的字符串长度
int res = charscmp("test", "test1");

当模板被实例化时,非类型模板参数的值,可能是调用时指定的,也可能是编译器推断的。
非类型模板参数的值,必须是常量表达式。 因为模板实例是在编译器编译时实例化的。
模板的定义并不会使编译器生成代码,只有在具体调用时,编译器实例化一个特定版本的函数,才会生成代码。

二、类模板
  1. 概述
    可以用类模板实例化一个特定的类。编译器不能为类模板推断模板参数类型,使用类模板必须显式指定模板参数。(比如:vector<int> )
    实例化类模板时,必须要有类的全部信息,包括类模板中的成员函数的函数体。 所以一般来说,所以类模板信息会放在.h头文件中。

  2. 类模板的定义与调用

template<typename T>
class myVector
{
public:
    typedef T* myiterator;  //迭代器

public:
    myVector();
    myVector& operator=(const myVector&);

public:
    myiterator mybegin();
    myiterator myend();

public:
    void myfunc1() // 成员函数体在类模板定义中,被隐式声明为内联函数
    {
        // todo
        return;
    };  
    void myfunc2();
};

// 成员函数体,在类模板定义外
template<typename T>
void myVector<T>::myfunc2()
{
    // todo
    return;
}

template<typename T>
myVector<T>& myVector<T>::operator=(const myVector&) // <T> 表示返回的是一个实例化了的myVector
{
     return *this;
}

int main()
{
  myVector<int> vec;  //调用时,编译器生成具体的类
  return 0;
}

myVector是类模板名,不是一个类名, 类模板是用于实例化类用的。
myVector<int> 才是类型名。

  1. 类模板的成员函数
  • 类模板成员函数体,写在类模板定义中时,会被隐式声明为inline函数。
  • 类模板的成员函数,具有和这个类模板相同的模板参数。类模板实例化后,模板的不同实例,都有自己版本的成员函数。
  • 类模板实例化时,其成员函数只有在被调用到时,才会被实例化。
  1. 非类型模板参数
template<typename T, int size = 10>
class myarray
{
private:
    T arr[size];
public:
    void myfunc();
};

template<typename T, int size>
void myarray<T, size>::myfunc()
{
    // todo
    return;
}

int main()
{
    myarray<int, 100> tmparray1;
    myarray<int> tmparray2;

    return 0
}
  • 非类型模板参数的限制:
    (1) 浮点型不能作为非类型模板参数 (double, float)
    (2) 类类型不能作为非类型模板参数(非类型一般是基础类型)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352