Home Article C++模板总结

C++模板总结

Release time:2020-07-29 22:06:51 Author:一蓑烟雨 Reading volume:340
模板是参数化多态工具:可以使参数多态(根据指定参数类型进行动态处理)
作用:参数的多态(使用相同的逻辑代码,可以处理不同的数据类型)
分类:函数模板、类模板、成员模板

函数模板

1.函数模板可以重载
2.模板实际被编译了两次,第一次检查语法是否正确,将函数模板隐式实例化,第二次将实例的函数进行编译
3.非类型模板参数可以有默认值,但默认值会影响函数重载

隐式实例化的特点:实例化多次,在多个文件都会进行实例
显示实例化的特点:只实例化一次,实现最优解

函数模板类模板尽量放在头文件。
#include <iostream>
#include <string>
using namespace std;

template <typename T>
T add(T a , T b){
    return a + b;
}

template <typename T , typename X>    //T X:类型模板参数
T add(T a , X b){
    return  a+b;
}

template <typename T , typename X , int num>    //num:非类型模板参数
T add(T a , X b){
    cout << "add(T , X , int)" << endl;
    cout << "num = " << num << endl;
}

template int add<int> (int , int);        //显式实例化

template<class T>//模板可以重载
void myprint(T a,T b)
{
    cout << "T func"<< endl;
}
template<class T>
void myprint(T a,T b,T c)
{
    cout << "T re func"<< endl;
}

int main(){
    //隐式调用
    add(2 , 3);
    add(5.0 , 'a');
    add(std::string("hello") , std::string("world"));

    //显式调用
    add<int , int>(5 , 6);
    add<int , int , 5>(1 , 2);
}
类模板

类模板只支持显示定义!

#include <iostream>
#include <string>
using namespace std;
template <typename T>
class A
{
public:
     T item;
     A()
     {

     }
     A(T a)
     {
         cout << "a =" << a<< endl;
     }
     void print();
     ~A()
     {

     }
     
};
template <typename T>
void A<T>::print()
{

cout << "out of class"<< endl;//类外定义的方式
}

int main()
{
    A<int> a(10);//类定义时必须给定类型
    return 0;
}


成员模板
为什么需要成员模板?
//不使用成员模板时:
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class A
{
public:
     T item;
     A()
     {

     }
     A(T a)
     {
         cout << "a =" << a<< endl;
     }
     void assign(const A<T> &x)
     {
         item = x.item;
     }
     ~A()
     {

     }
     
};

int main()
{
    A<double> d;
    A<int> i;
    d.assign(d);  //没问题
    //d.assign(i);  //由于上面已经将T当做double,就不能改为int,所以报错
}


//使用成员模板
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class A
{
public:
     T item;
     A()
     {

     }
     A(T a)
     {
         cout << "a =" << a<< endl;
     }
     template<typename X>//新模板
     void assign(const A<X> &x)
     {
         item = x.item;
     }
     ~A()
     {

     }
     
};

int main()
{
    A<double> d;
    A<int> i;
    d.assign(d);  //没问题
    d.assign(i);  //没问题
}

模板全特化与偏特化
模板特化的原因:
编译器认为,对于特定的类型,如果某一功能可以更好的实现,那么就应该使用该功能。
模板实例化时会优先匹配模板参数最符合的特化版本
模板特化的前提是模板的泛华
特化的是模板成员函数而不是模板,函数模板不能偏特化
调用优先级:普通函数、重载函数、函数全特化
template 
class A{
    T1 data1;
    T2 data2;
};
//模板全特化
template <>
class A{
    int data1;
    double data2;
};

//模板偏特化:类型模板参数的数量变化
template
class A{
    T1 data1;
    string data2;
}

//模板偏特化:类型模板参数的范围变化
template 
class A{
    T1 data1;
    T2 data2;
};

#include 
using namespace std;
//函数模板的调用规则
//1.如果函数模板和普通函数都可以实现,优先调用普通函数
//2.可以通过空模板参数列表来强制调用函数模板
//3.函数模板也可以发生函数重载
//4.如果函数模板可以产生更好的匹配,优先调用函数模板

void myprint(int a,int b)
{
    cout <<"common func"<< endl;

}
template
void myprint(T a,T b)
{
    cout << "T func"<< endl;
}
template
void myprint(T a,T b,T c)
{
    cout << "T re func"<< endl;
}
int main()
{
    int  a = 10;
    int  b = 20;
    myprint(a,b);
    //通过空模板,强制调用
    myprint<>(a,b);
    myprint(a,b,100);

    char ch = 'a';
    char ch1 = 'b';
    myprint(a,b);//调用函数模板

    return 0;
  
I want to comment

Search

classification

Leave a message
http://blog.rjxj513.com/
User login
You have not written any reviews yet!
You have commented!
Can only praise once!
You have a collection!