首页 > 其他分享 >类模板

类模板

时间:2024-03-29 22:55:56浏览次数:20  
标签:myvector cout template TC 模板 特化

1. 类模板的基本范例和模板参数的推断

基本范例:

类模板,也是生产类的工具,通过给定的模板参数,生成具体的类。类模板的声明和实现一般都放在同一个头文件中,因为实例化的时候必须有类模板的全部信息。

template<typename T> // T表示myvector这个容器所存储的元素类型
class myvector {
public:
    typedef T* myiterator;
    
public:
    myvector();
    myvector& operator=(const myvector&);
public:
    void myfunc() {
        cout << "myfunc()被调用" << endl;
    }
public:
    myiterator mybegin();
    myiterator myend();
};

template<typename T>
myvector<T>::myvector() {} //类外构造函数的实现

int main() {
    myvector<int> tmpvec;
    tmpvec.myfunc();
}

上述在类模板myvector定义之外写构造函数的实现体时,myvector<T>::myvector()中::左侧是类型名,右侧是类名。如果在类模板内部,则类型名可以简写成类名,如myvector& operator=(const myvector&);,如果写完整,应该是myvector<T>& operator=(const myvector&);

在main()主函数中,类型名中的模板参数(int)不能省略,这不同于函数模板某些模板参数可以省略,依靠推断解决。

在类模板中,调用成员函数与调用一个类的成员函数没有区别,直接调用即可。但成员函数只有被调用的时候才会实例化,如果类模板中有静态成员函数,静态成员函数也会在调用的时候被实例化。

模板参数的推断:

在C++17标准中,类模板的类型模板参数变得也可以推断。

template<typename T>
struct A {
    A(T val1, T val2) {
        cout << "..." << endl;
    }
    
    A(T val) {
        cout << "..." << endl;
    }
};

int main() {
    A obj1(15, 16);
    A obj2(12.8);
}

对于类模板A的每个构造函数,都有一个隐式的模板参数推断机制存在,称为隐式的推断指南,形式如下:

template<typename T>
A(T, T) -> A(T);

首先,第一行把类模板的参数复制过来,第二行用->分成两部分并以分号结尾。表示出现->左侧部分内容或形式时,请推断成->右侧的类型含义。

类模板的特化

类模板的全特化:

先看一下类模板的泛化版本:

template<typename T, typename U>
struct TC{
    TC() {
        cout << "..." << endl;
    }
    void functest() {
        cout << "..." << endl;
    }
};

所谓全特化,就是把泛化版本中的所有模板参数都用具体的类型代替,在书写全特化版本时,template后的<>变为空。

template<>
struct TC<int, int> {
    TC() {
        cout << "..." << endl;
    }
    void functest() {
        cout << "..." << endl;
    }
};

这里要注意的时,如果functest()函数放在类外去写,应当是如下形式:

// template<> 注意不需要使用这行,否则会语法发错
void TC<int, int>::functest() {
    cout << "..." << endl;
}

普通成员函数的全特化:

 

template<typename T, typename U>
struct TC{
    TC() {
        cout << "..." << endl;
    }
    
    void functest() {
        cout << "泛化版本" << endl;
    }
};

template<> // 普通成员函数的全特化从本行开始
void TC<double, int>::functest() {
    cout << "特化版本" << endl;
}

如果在main()函数中添加新代码:

TC<double, int> mytc;
mytc.functest();

特化版本的成员函数将会取代泛化版本的被调用。

类模板的偏特化:

全特化是把所有类型参数都用具体类型代表。而偏特化可以从两个方面理解,一个是模板参数数量上的偏特化,一个是模板范围上的偏特化。

  • 模板参数数量上的偏特化:
template<typename T>
struct TC<float, U> {
    TC() {
        cout << "..." << endl;
    }
    
    void functest();
};

template<typename U>
void TC<float, U>::functest() {
    cout << "..." << endl;
}
  • 模板参数范围上的偏特化:

所谓参数范围指的是原来是int类型,如果现在变成const int类型(与int相比范围更窄了)。其它诸如从任意类型T缩小为指针类型T*,T&,T&&。

template<typename T, typename U>
struct TC<const T, U*> {
    TC() {
        cout << "..." << endl;
    }
    
    void functest();
};

template<typename T, typename U>
void TC<const T, U*>::functest() {
    cout << "..." << endl;
}

 

标签:myvector,cout,template,TC,模板,特化
From: https://www.cnblogs.com/love-9/p/18104786

相关文章

  • 类模板中的友元
    1.友元类传统友元类的概念是:让某个类B成为另外一个类A的友元类,这样的话,类B就可以在其成员函数中访问类A的所有成员(成员变量、成员函数),而不管这些成员在类A中是用什么修饰符(private、protected、public)修饰的。如果现在类A和类B都变成了类模板,那么能否让类模板B成为类模板A的友元......
  • C++精品小案例:C++中的多态性及其实现、模板元编程及其在C++中的应用
    1.C++中的多态性及其实现多态性是面向对象编程的三大特性之一,它允许使用父类类型的指针或引用来指向子类对象,并通过这个父类类型的指针或引用来调用实际子类的成员函数。这样,就可以在运行时确定应该调用哪个具体的函数实现,从而实现一个接口多种形态。多态性主要通过虚函数来......
  • WPF中使用PDF模板实现PDF导出和预览-来自GPT4
    在C#和WPF项目中实现加载不同的PDF模板、查看报告和导出PDF文件的功能,可以通过以下步骤完成:1.选择PDF库首先,选择一个合适的.NETPDF库。有许多库可以帮助你处理PDF文件,包括但不限于:iTextSharp:一个功能强大的和灵活的库,适用于创建和修改PDF文件。它是iText的一个.NET端口。......
  • 【Vue】模板语法
    用js完成输出输入框中的值到列表中constbuttonEl=document.querySelector('button');constinputEl=document.querySelector('input');constlistEl=document.querySelector('ul')0;functionaddGoal(){ constenteredValue=inputEl.value; c......
  • 【模板】快速读入
    1inlineintread()2{3intw=0,s=1;4charch=getchar();5while(ch<'0'||ch>'9')6{7if(ch=='-')s=-1;8ch=getchar();9}10while(ch>='0'&&ch<='9')11{12w=w*10+ch......
  • 软件项目管理全套文档模板(开发/实施/运维/安全/交付)
     前言:在软件项目管理中,每个阶段都有其特定的目标和活动,确保项目的顺利进行和最终的成功交付。以下是软件项目管理各个阶段的详细资料:软件项目全套文档资料下载:点我获取1.需求阶段目标:收集、分析和定义用户需求和业务目标。主要活动:需求调研:与用户沟通,了解他们的需求和......
  • FLASK学习记录-宏、模板继承
    宏{%macroname%}{%endmacro%}app.pyfromflaskimportFlask,render_templateapp=Flask(__name__)@app.route('/')defindex1():returnrender_template("macro1.html")@app.route("/")defindex2():returnrend......
  • 软件项目管理全套通用模板(规格说明书~详细设计~测试计划~验收报告)
     前言:在软件开发过程中,文档资料是非常关键的一部分,它们帮助团队成员理解项目需求、设计、实施、测试、验收等各个环节,确保项目的顺利进行。以下是针对您提到的各个阶段的文档资料概述:所有资料获取:点击获取开发阶段需求规格说明书:详细描述了软件系统的功能需求、非功能......
  • 写模板,线段树
    1意义:线段是是为了对区间中的元素进行操作,而衍生出来的一种数据结构,比如区间加减,区间求和。线段树将1~n的区间分解成4n个小区间。2过程:区间修改就是对一个或者多个节点按照设定的规则对数值进行修改。区间查询就是对一个或多个节点查询的结果按规则进行合并,得到最终结果。其......
  • 最近公共祖先(lca)倍增算法【模板】
    P3379【模板】最近公共祖先(LCA)-洛谷|计算机科学教育新生态(luogu.com.cn)#include<bits/stdc++.h>#include<cstdio>usingnamespacestd;constintN=5e5+100;constintinf=0x3f3f3f;intn,m,s;vector<int>g[N];intdep[N];//存u点的深度intfa[N][20];//存从u......