C++中的模板(函数模板,类模板)

1.模板是生成类或函数的框架,模板使用形参,当实际数据类型赋值给形参的时候,才由编译器生成类或函数

2.函数模板的声明由关键字template和包含一个或多个数据类型形参的参数列表构成,形参数据类型(T)前面可以是class也可以是typename,类型形参T要用尖括号<>括起来:

Template <typename T>或Template<classT>

3.函数模板的调用

#include "stdafx.h"

#include<stdio.h>

template <class T>

T max(T a,T b)

{

    returna>b?a:b;

}

int _tmain(int argc, _TCHAR* argv[])

{

    printf("%d\n",max(3,10));//更ü完?善?写′法ぁax<int>(3,10)

    printf("%f\n",max<double>(21.3,20.1));

    return 0;

}

4.用作模板的类型可以是基本类型,也可以是一个类,类似于函数模板的做法,类模板对成员数据和成员函数的参数类型进行泛化,下面是一个模板类A,构造函数和comp函数均在模板声明中定义,成为内联函数,print_Type函数在模板外定义,需要用关键字template说明T1和T2是模板类型,并以A<T1,T2>::做函数的前缀作用域

//templae2.cpp : 定¨义?控?制?台?应畖用?程ì序ò的?入?口ú点?。£

//

#include "stdafx.h"

#include <stdio.h>

#include <typeinfo.h>

template <class T1,class T2>

class A{

    T1 i;

    T2 j;//

public:

    A(T1 t1,T2 t2){i=t1;j=t2;}//内联函数

    bool comp(){return i>j;}//内联函数

    voidprint_Type();//函数声明

};

//成员函数printf_type定义

template <class T1,class T2>

voidA<T1,T2>::print_Type(){

    printf("i的类型是%s\n",typeid(i).name());//打印i的类型名

    printf("j的类型是?%s\n",  typeid(j).name());

}

int _tmain(int argc, _TCHAR* argv[])

{   A<int,double> a(3,89.2);

    if(a.comp())

    {

        printf("i>j\n");

    }

    else printf("i<=j\n");

    a.print_Type();

    return 0;

}

5.当模板的泛化处理不适合某个特定的数据类型时,可针对这个数据类型给出相应的模板,包括函数模板特化和类模板特化(叫完全特化技术也叫精确特化)

猜你喜欢

转载自blog.csdn.net/zhgeliang/article/details/81239080