首页 > 编程语言 >C++ templates: (1)、类模板

C++ templates: (1)、类模板

时间:2024-04-04 11:04:19浏览次数:14  
标签:templates const int oContainer C++ template Stack 模板

1、类模板定义(主模板)

template<typename T, typename C=list<T>, int MAX=10>
class Stack{
public:
    using value_type = T;
public: 
    Stack(const T& a):m_oContainer{move(a)}{
        cout << "Stack<T,list<T>>()" << endl;
    }
    ~Stack(){}

    void push(const T& item){
        m_oContainer.push_front(item);
    }
    
    void pop(){
        m_oContainer.pop_front();
    }

    const T& top(){
        return m_oContainer.front();
    }

    int size(){
        return m_oContainer.size();
    }
private:
    C m_oContainer;
};

2、模板特化(偏特化)

       可以理解为模板的一个特例,需要特殊处理的情况


template<>
class Stack<int, vector<int>>{
public: 
    Stack(const int& a):m_oContainer{move(a)}{
    }
    ~Stack(){}

    void push(const int& item){
        m_oContainer.push_back(item);
    }
    
    void pop(){
        m_oContainer.pop_back();
    }

    const int& top(){
        return m_oContainer.back();
    }

    int size(){
        return m_oContainer.size();
    }
private:
    vector<int> m_oContainer;
};

3、别名模板

template<typename T>
using ListStack = Stack<T, list<T>>;

4、成员类型的别名模板

template<typename T>
using ListStackValueType = Stack<T, list<T>>::value_type;

5、推导指引

     说明如何转化类模板构造函数的参数类型

Stack( char const*)->Stack<string>;

完整示例代码:

#include <iostream>
#include <vector>
#include <list>
#include <vector>
using namespace std;

template<typename T, typename C=list<T>, int MAX=10>
class Stack{
public:
    using value_type = T;
public: 
    Stack(const T& a):m_oContainer{move(a)}{
        cout << "Stack<T,list<T>>()" << endl;
    }
    ~Stack(){}

    void push(const T& item){
        m_oContainer.push_front(item);
    }
    
    void pop(){
        m_oContainer.pop_front();
    }

    const T& top(){
        return m_oContainer.front();
    }

    int size(){
        return m_oContainer.size();
    }
private:
    C m_oContainer;
};

Stack( char const*)->Stack<string>;


template<>
class Stack<int, vector<int>>{
public: 
    Stack(const int& a):m_oContainer{move(a)}{
    }
    ~Stack(){}

    void push(const int& item){
        m_oContainer.push_back(item);
    }
    
    void pop(){
        m_oContainer.pop_back();
    }

    const int& top(){
        return m_oContainer.back();
    }

    int size(){
        return m_oContainer.size();
    }
private:
    vector<int> m_oContainer;
};

template<typename T>
using ListStack = Stack<T, list<T>>;

template<typename T>
using ListStackValueType = Stack<T, list<T>>::value_type;

int main(){
    Stack a("hello");
    Stack b{"hello"};
    Stack c = {"hello"};

    Stack d = 12;

    ListStack e = 1;
    ListStackValueType<char> f;
    return 0;
}

标签:templates,const,int,oContainer,C++,template,Stack,模板
From: https://blog.csdn.net/qq_33271629/article/details/137369319

相关文章

  • C++:递增递减运算符(16)
    递增递减就是自加1或者自减1,但是还有前置递增,后置递增,前置递减,后置递减,两者的区别也大有不同,接下来就去看一下过程a=1b=1b=++aa=2b=2a=1b=1b=a++a=2b=1a=2b=2b=--aa=1b=1a=2b=2b=a--a=1b=2递增前置递增#include<iostream>usingnamespacestd;intmain()......
  • 使用vscode创建c++项目
    Vscode创建c++项目1.初始化并配置C++项目目标:创建C++文件,并自动生成tasks.json和launch.json,能够支持单文件和多文件的编译和调试步骤:创建一个空文件夹,然后选择用vscode打开在文件夹里编写一个c++文件(也可以在里面再次创建一个存放c++源码的文件夹)然后选择g++编译运......
  • 请描述一下Velocity模板中的循环结构是如何工作的。Velocity有哪些内置的函数和方法?能
    请描述一下Velocity模板中的循环结构是如何工作的。Velocity是一个基于Java的模板引擎,它允许开发人员使用简单的模板语言来引用由Java代码定义的对象,并在生成的文本中呈现这些对象。在Velocity模板中,循环结构用于遍历集合或数组,并对每个元素执行特定的操作。在Velocity模......
  • 常见面试题--动态规划介绍(附C++源码实现)
    关注我,持续分享逻辑思维&管理思维;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自我介绍》, 《做好面试准备,迎接2024金三银四》。【图解《程序员面试常见的十大算法......
  • 代码模板
    代码模板基本代码模板#pragmaGCCoptimize(1)#pragmaGCCoptimize(2)#pragmaGCCoptimize(3,"Ofast","inline")#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_stdio(false);cin.t......
  • 第十四届省赛大学B组(C/C++)子串简写
    原题链接:子串简写程序猿圈子里正在流行一种很新的简写方法:对于一个字符串,只保留首尾字符,将首尾字符之间的所有字符用这部分的长度代替。例如 internationalization 简写成 i18n,Kubernetes 简写成 K8s,Lanqiao 简写成 L5o 等。在本题中,我们规定长度大于等于 K 的字......
  • [7] UE C++
    Day3  制作引擎使用的属性//制作引擎使用的属性UPROPERTY()classUPaperFlipbook*RedBird;UPROPERTY(EditAnywhere,Category="SelfProprety|Number")//可读可写标记int32Number;//在细节面板中可以被编辑,同时也能被访问UPROPERTY(VisibleAnywhere)//只读标记int32A......
  • 【c++基础】数池塘(四方向)
    说明农夫约翰的农场可以表示成N*M(1≤N、M≤100)个方格组成的矩形。由于近日的降雨,在约翰农场上的不同地方形成了池塘。每一个方格或者有积水('W')或者没有积水('.')。农夫约翰打算数出他的农场上共形成了多少池塘。一个池塘是一系列相连的有积水的方格,每一个方格周围的四个方格都被......
  • (C++)auto关键字(C++11)——<入门>
    类型别名思考:随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在:1.类型难于拼写2.含义不明确导致容易出错#include<string>#include<map>intmain(){std::map<std::string,std::string>m{{"apple","苹果"},{"orange","橙子"......
  • (C++)内联函数——<入门>
    概念:以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。 查看方式:1.在release模式......