模板与泛型

目录

模板简要

template<typename T>
template<typename T = int>  //默认值
  • 类型T必须支持模板中的各种操作
  • 模板在程序编译期间被实例化,T的值必须是编译期常量表达式
  • 模板不会产生代码,只有在调用模板时才会产生特定类型的代码
  • 模板参数可以有默认值

函数模板

template<typename T>
const T& max(const T& a, const T& b)
{
   
    return a > b ? a : b;
}

int main()
{
   
    max(12,34);             
    //编译器根据函数实参推断出T是int类型,int类型支持 > 运算符

    max<double>(12.34,56);  
    //必须显式指定模板参数,编译器推断不出来

    max<A>(A(),A());        
    //类A必须支持 > 运算

    return 0;
}
  • 类型T必须支持函数模板里的各种操作,比如上面这个max函数模板,类型T必须支持>比较运算符。
  • 函数模板本身不会产生代码,只有调用函数模板时,才会在编译期间生成一个特定的函数。
  • 如果不调用函数模板,就不会产生任何代码。
//普通类型作为模板类型参数
template<typename T,int Q>
const T& max(const T& a, const T& b)
{
   
    return a > b ? a : b;
}

int main()
{
   
    max<int,5>(12,34);      
    //此时的5也就是模板类型int Q没什么用,仅做测试

    int a = 5;
    max<double,a>(12.34,56);  
    //编译失败,模板参数的值必须在编译期间就能确定,只能使用常量,const 或者 constexpr
    
    return 0;
}
  • 普通类型也可以作为模板参数,例如intconst int
  • 类类型和浮点类型不能作为模板参数

类模板

  • 必须显式指定模板类型参数,编译器推断不出来
  • 类模板的函数声明和实现必须放在同一个头文件中
  • 类模板的成员函数(包括普通函数)只有为程序所用才进行实例化。如果某函数从未使用,则不会实例化该成员函数
  • 类模板参数也可以是普通类型
template<typename T>
class Myclass
{
   
public:
    Myclass();
    ~Myclass()
    {
   
        //析构函数,类内定义
    }
    Myclass<T>& operator=(const Myclass& myclass);
    Myclass& operator=(const Myclass& myclass);
    //在类内,上面两种方式均可,<T>可以不加,但在类外定义一定要加<T>
    //因为Myclass<T>才是完整类,Myclass只是一个模板不是类
};

template<typename T>
Myclass<T>::Myclass()
{
   
    //构造函数,类外定义,注意::之前是带<T>的完整类名
}

template <typename T>
Myclass<T>& Myclass<T>::operator
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值