c++函数模板

本文探讨了函数模板的二次编译原理,类模板的参数化和继承机制,以及静态成员模板的应用。通过实例演示了如何使用模板进行类型转换,并讲解了关键字typename在内嵌依赖中的作用。同时涵盖了模板全特化和偏特化的概念,以及在实际开发中的运用技巧。
摘要由CSDN通过智能技术生成

函数模板

通过建立一个通用函数,其类型与形参不具体指定,用虚拟类型表示,这个函数就是函数模板

 template<类型形式参数表typename>

类型   函数名<形式参数表>

{

        语句块
}

在需要类型转换时,需要显示调用

test<int, char>('a',65);

 函数模板实现机制:

二次编译/延迟编译:第一次编译时看到函数模板定义,只做语法检错不检查数据类型的错误,第二次当实例化对象时,看到函数模板根据传递参数再检查数据类型错误。

类模板

概念:

类模板中定义的函数参数类型或者属性等数据类型可以参数化。 

template<typename T>

class A

{

public:

        T a;

}

调用时必须显示调用

A<int> a;

类模板的继承

普通函数继承:

继承的同时对基类实例化Class Child:public Parent<int>

模板类派生模板类:

继承的同时不会对parent实例化。

 模板中是static

模板类会根据具体类型生成各种各样的类,每一个类所实例化的对象都共享这个静态变量。

 成员模板

 作用:

为了实现有别于模板类的虚拟类型。不然在类中只有具体类型和模板类虚拟类型,现在有了成员函数模板虚拟类型。

1.class的成员可以是template

2.但成员模板不能是virtual

3. 被用来支持class template内的成员之间的自动类型转换。

#include <iostream> 
using namespace std; 
template <typename T> 
class Test 
{
public: 
    T m_a; 
public: 
    template<typename X>
    void print(const Test<X> &a) 
    { 
        cout << a.m_a << endl; 
    } 
};
int main(int argc,char *argv[]) 
{ 
    Test<int> a; 
    a.m_a = 1; 
    Test<double> b; 
    b.m_a = 1.123; 
    a.print(a);
    a.print(b); 
    b.print(b);
    b.print(a); 
    return 0; 
}

 关键词:typename

内嵌依赖函数类型名

1.内嵌:指在类的内部定义的

2.依赖:依赖于一个模板参数

3.类型名:最终指出一个类型名

实例化

隐式实例化:

在函数调用时,不指定数据类型名,编译器自动推演参数类型,之后对函数模板实例化

显示实例化:

在外部指定数据类型,且在调用前将函数模板实例化。

模板全特化和偏特化

作用:

处理一些模板处理不了或者处理不好的数据而理性,需要将这些类型特例化,按照特例化
的方法处理

原理:

对于特定的类型,传参时,会优先匹配“模板参数”最符合传参的模板。

偏特化:

1.模板参数数量

2.模板参数类型

3.模板参数范围(const)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值