模板实例化

本文介绍了C++中模板实例化的概念,包括类模板和函数模板的实例化过程。详细解释了模板实参推断机制,以及如何处理不同类型的模板参数。此外,还探讨了显式指定模板参数的情况和非类型模板参数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 概念:

    产生模板的特定类型实例的过程称为实例化。包括:类模板的实例化和函数模板的实例化。

二 类模板实例化
    要使用类模板必须显示指定模板形参。在类模板的内部使用时,可以使用类模板的非限定名。
    例如:
    template<typename T> 
    class Queue
    {
     public:
     Queue(){}
     Queue(Queue &Q):a(Q.a){}//等价于Queue<Type>(Queue<Type> &Q):a(Q.a){} 不使用类模板限定。
     private:
     int a;
     };
    Queue<string>queue;
    实际上,当编写Queue<int>时,编译器通过重新编写Queue模板,用类型int代替模板形参的每次出现而创建Queue<int>类。

三 函数模板实例化
     使用函数模板时,编译器通常会推断模板实参

四 模板实参推断(template argument deduction)
     模板实参推断: 从函数实参确定模板实参的类型和值的过程。
     
     1.多个类型形参的实参必须完全匹配
        例如:template<typename T>
                   void test1(T &t1,T &t2)
                   {
                       cout<<t1<<"\n"<<t2<<endl;
                        }
                  调用:
                            int t1=1;
                            short int t2=2;
                            test1(t1,t2);//错误,形参与实参类型完全匹配,不允许常规转换。
                   如果需要常规转化:函数必须用两个类型形参来定义。
                   template<typename T1,typename T2>
                   void test1(T1 &t1,T2 &t2)
                   {
                       cout<<t1<<"\n"<<t2<<endl;
                        }

       2.  类型形参的实参的受限转换
           一般而言,不会转换实参以匹配已有的实例化,相反,会产生新的实例。
            除了产生新的实例外,编译器只执行两种转换:

           const转换:可以用非const对象的指针或引用来调用接受const指针或const引用的函数;如果函数接受非引用形参,形参类型和实参类型都忽略const。

            数组或函数到指针的转化:如果模板形参不是引用类型,则对数组和函数类型的实参应用常规指针转换。
                     
五   函数模板的显式形参
    在某些情况下,不可能推断模板实参的类型,那么就有必要覆盖模板实参推断机制,并显式指定为模板形参所用的类型或值。
 
六 非类型模板形参非模板形参 

     1.非类型模板形参:模板形参不必都是类型。
         
        函数模板非类型形参和类模板非类型形参:在需要常量表达式时可以使用非类型形参,非类型实参必须是常量表达式。

     2. 非模板形参
         template<typename T>void test(T &t,int a);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值