06_C++泛型编程(函数模板与类模板)

泛型编程主要集中在:泛 型 =》数据类型“泛”

泛也可以说是模糊的意思,就是说这是一种将数据类型透明化的编程方式。

泛型编程的大概想法就是用模板的概念,向各个数据类型都提供编程接口,实现同一种功能,
替代:每一种数据类型的同一种功能都去实现重复的代码。

模板:函数模板 && 类模板

(一)函数模板
1.demo:
template
T hello(T x)
{
    return x + x;
}

int main(int argc, char **argv)
{
    int x = 2;
    int ret_i = hello(x);
    cout << ret_i << endl;//output:4

    string s = "str";
    string ret_s = hello(s);//output:strstr
    cout << ret_s << endl;

    return 0;
}

由上可见:int 和 string 类型 的加法运算(同一种实现方式)只用一份代码就实现了.

Note1:不同类型,但是运算符操作一定要被允许,当然也可以自己在类中重载运算符.
Note2:
template
T hello(T x)
{
    return x + x;
}
其中typename 还可以是class 关键字,可以有多个参数如:
template
T1 hello(T1 x, T2 y)
{
    /*opt*/
    return xxx;
}
返回值一般为T1。

(二)类模板
1.demo
template
class TemplateClass {
private:
    T1 value1;
    T2 value2;

protected:

public:
    TemplateClass() {}
    ~TemplateClass() {}

    T1 func(T1 x, T2 y);
};

template
T1 TemplateClass::func(T1 x, T2 y)
{
    cout << "T1:" << x << endl;
    cout << "T2:" << y << endl;

    return 2*x;
}


int main(int argc, char **argv)
{
    int x = 2;
    string y = "carl";
    TemplateClass tmp;

    int m = tmp.func(x, y);//正常输出
    cout << "m = " << m << endl; //output:4

    return 0;
}

Note1:当类成员定义在类外部时,形如:
template
T1 TemplateClass::func(T1 x, T2 y) { /**/ }

Note2:多参数模板的参数类型可不一致。


(三)穿越透明
虽然模板是对程序员透明的,但实际上是编译器根据传入数据的类型,自动推导参数类型,并生成真正带类型的模板(函数、类)

Note:比如函数(or 类)模板编译后的链接地址为A1,那么编译器生成带类型的函数(or 类)的链接地址在A2。(不同类型参数组合会生成多个)
他们是独立的。(可编程获取地址测试)
int main(int argc, char **argv)
{
    TemplateClass *ptr1 = new TemplateClass;
    TemplateClass *ptr2 = new TemplateClass;

    cout << ptr1 << "\t" << ptr2 << endl;

    delete ptr1;
    ptr1 = nullptr;
    delete ptr2;
    ptr2 = nullptr;

    return 0;
}
output:0071D760 0071E3C0   
印证之!

你可能感兴趣的:(C++)