C++类模板的特化(三)

2023-11-07

本文主要介绍类模板的特化、局部特化和缺省模板实参;

1.类模板的特化

类模板的特化(Class Template Specialization)是指为特定的模板参数提供自定义实现的过程。通过特化,我们可以针对某些特定的类型或条件提供不同的行为或实现;

如果需要特化一个类模板,需要特化该模板中的所有成员函数;

模板的特化注意事项:
需要将模板写成template <>,并且需要指明特定的类型,下面示例需要特化std::string的类型,成员函数按照正常的函数实现即可

template <>
class Stack <std::string>
{}

示例

/*
 * @brief: class complates
 * @complie: g++ -g *.cc -o d -std=c++11
 * @autor: your name
 * @date: 2023/08/22
 */

#include <iostream>
#include <vector>
#include <stdexcept>

template <class T>
class Stack 
{
private:
    std::vector<T> elems;

public:
    void push(T const&);
    void pop();
    T top() const;
    bool empty() const
    {
        return elems.empty();
    }    
    int32_t getElemsSize() const
    {
        std::cout<<"not string size"<<std::endl;
        return elems.size();
    }
};

template <typename T>
void Stack<T>::push(T const& elem)
{
    elems.push_back(elem);
}

template <typename T>
void Stack<T>::pop()
{
    if(elems.empty()) 
    {
        throw std::out_of_range("empty stack");
    }
    elems.pop_back();
}

template <typename T>
T Stack<T>::top() const
{
    if(elems.empty()) 
    {
        throw std::out_of_range("empty stack");
    }
    return elems.back();
}


//std::string
template <>
class Stack <std::string>
{
private:
    std::vector<std::string> elems;

public:
    void push(std::string const&);
    void pop();
    std::string top() const;
    bool empty() const
    {
        return elems.empty();
    }    
    int32_t getElemsSize() const
    {
        std::cout<<"string size"<<std::endl;
        return elems.size();
    }
};

void Stack<std::string>::push(std::string const& elem)
{
    elems.push_back(elem);
}

void Stack<std::string>::pop()
{
    if(elems.empty()) 
    {
        throw std::out_of_range("empty stack");
    }
    elems.pop_back();
}

std::string Stack<std::string>::top() const
{
    if(elems.empty()) 
    {
        throw std::out_of_range("empty stack");
    }
    return elems.back();
}

int main(int argc, char* argv[])
{
    Stack<int> int_stack;
    int_stack.push(10);
    int_stack.push(20);
    int_stack.push(30);
    std::cout<<int_stack.getElemsSize()<<std::endl;

    //std::string
    Stack<std::string> string_stack;
    string_stack.push("class");
    string_stack.push("int");
    string_stack.push("int64");
    string_stack.push("double");
    string_stack.push("float");
    std::cout<<string_stack.getElemsSize()<<std::endl;


    return 0;
}

2. 类模板的局部特化

类模板的局部特化(Partial Class Template Specialization)是指针对模板参数的部分特化,只针对某些特定的条件进行自定义实现的过程。通过局部特化,我们可以为满足特定条件的模板参数提供不同的实现。

示例

/*
 * @brief: class complates
 * @complie: g++ -g *.cc -o d -std=c++11
 * @autor: your name
 * @date: 2023/08/22
 */

#include <iostream>
#include <vector>
#include <stdexcept>
#include <string>

//局部特化
template <typename T, typename U>
class MyClass
{
public:
    void print() const
    {
        std::cout<<"typename and typename"<<std::endl;
    }
};

template <typename T>
class MyClass<T, std::string>
{
public:
    void print() const
    {
        std::cout<<"typename and string"<<std::endl;
    }
};

template <typename T>
class MyClass<T, double>
{
public:
    void print() const
    {
        std::cout<<"typename and double"<<std::endl;
    }
};



int main(int argc, char* argv[])
{
    MyClass<int, int> int_myclass;
    int_myclass.print();

    MyClass<int, std::string> string_myclass;
    string_myclass.print();

    MyClass<int, double> double_myclass;
    double_myclass.print();

    return 0;
}

输出

typename and typename
typename and string
typename and double

3. 缺省模版实参

在函数模板的时候,可以将模板的参数定位为缺省值;即支持默认,也支持指定,使用起来更加的方便;

示例

/*
 * @brief: class complates
 * @complie: g++ -g *.cc -o d -std=c++11
 * @autor: your name
 * @date: 2023/08/22
 */

#include <iostream>
#include <vector>
#include <deque>
#include <stdexcept>
#include <string>

//缺省模版参数
template <typename T, typename CONT = std::vector<T>>
class Stack 
{
private:
    CONT elems;

public:
    void push(T const&);
    void pop();
    T top() const;
    bool empty() const
    {
        return elems.empty();
    }    
    int32_t getElemsSize() const
    {        
        return elems.size();
    }
};

template <typename T, typename CONT>
void Stack<T, CONT>::push(T const& elem)
{
    elems.push_back(elem);
}

template <typename T, typename CONT>
void Stack<T, CONT>::pop()
{
    if(elems.empty()) 
    {
        throw std::out_of_range("empty stack");
    }
    elems.pop_back();
}

template <typename T, typename CONT>
T Stack<T, CONT>::top() const
{
    if(elems.empty()) 
    {
        throw std::out_of_range("empty stack");
    }
    return elems.back();
}


int main(int argc, char* argv[])
{
    //使用默认值
    Stack<int> int_stack;
    int_stack.push(10);
    int_stack.push(20);
    int_stack.push(30);
    std::cout<<int_stack.top()<<std::endl;

    //赋值类型
    Stack<double, std::deque<double>> double_stack;
    double_stack.push(10.11);
    double_stack.push(20.22);
    double_stack.push(30.33);
    std::cout<<double_stack.top()<<std::endl;

    return 0;
}

输出

30
30.33
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++类模板的特化(三) 的相关文章

随机推荐

  • psql命令

    psql备份数据库 su postgres pg dump d map gt map sql 导出sql psql d map f map sql 导入sql psql导出数据到文件 COPY SELECT gid name FROM l
  • java强引用、软引用、弱引用、虚引用

    前言概述 在JDK1 2以前的版本中 当一个对象不被任何变量引用 那么程序就无法再使用这个对象 这就像在日常生活中 从商店购买了某样物品后 如果有用 就一直保留它 否则就把它扔到垃圾箱 由清洁工人收走 一般说来 如果物品已经被扔到垃圾箱 想
  • 【群智能算法】一种改进的蜣螂优化算法IDBO[2]【Matlab代码#18】

    文章目录 获取资源 请见文章第5节 资源获取 1 原始DBO算法 2 改进后的IDBO算法 2 1 Bernoulli混沌映射种群初始化 2 2 自适应因子 2 3 Levy飞行策略 2 4 动态权重系数 3 部分代码展示 4 效果图展示
  • Spring 事件发布机制

    目录 事件驱动 使用事件机制 Java 事件使用 Spring 事件使用 使用 Aware 不使用 Aware Spring 事件发布流程及源码解析 ApplicationEvent ApplicationListener 监听者注册 Ap
  • node常见面试题库

    node常见面试题库 1 检测系统中node版本号的指令是 node v 2 如何退出node执行环境 REPL环境 ctrl c c 3 node如何创建服务器 写出代码 var http require http var server
  • 合理设置的MTU值,解决“部分网站打不开”“上网速度慢”等问题,并且可以适当提升上网速度

    一般来讲 设计好本机的MTU值 可以解决 部分网站打不开 上网速度慢 的情况 但是如果你的共享主机或路由器的MTU设置有问题 有时问题仍然存或 或者出现网速过慢的情况 合理的设置路由器与本机的MTU值 就可以完全解决上述问题 使上网速度达到
  • AndroidJavaClass 和AndroidJavaClass

    很明显 AndroidJavaClass 就代表一个Java类 例如 com henry util 有一个静态方法 love 可以这样new AndroidJavaClass com henry util callstatic love 就
  • swagger mock文档服务器,通过 Swagger 定义自动生成 Mock 数据

    我最近的在做的项目是一个前后端分离的项目 前后端由不同的团队分别开发 并且前端的进度经常领先后端 这就意味着 当前端在开发一个新功能时 API 可能还没有准备好 不过 我们会先和后端先商议好 API Schema 然后使用 Mock 数据进
  • 使用PowerDNS实现内网DNS解析

    部署环境 公司内部安装powerdns实现局域网服务dns解析 避免通过ip访问 系统 CentOS 7 9 mysql版本 5 7 33 pdns版本 4 4 1 pdns recursor版本 4 4 2 PowerDNS admin版
  • ARTS挑战打卡的100天,我学到了这些

    前言 知道ARTS打卡计划是来源于陈皓的极客时间教程 在大学期间就知道了陈皓 左耳朵耗子 骨灰级程序员 差不多就是看着他的博客成长 后来在极客时间上发现了他的课程 就买下来了 现在学习了75 过程中发现了ARTS打卡计划 一直不敢尝试 一个
  • 第二课:变量和数据类型

    第二课 变量和数据类型 一 了解什么是变量 为什么需要它 1 计算机中的内存分类 1 RAM 运行时存储 我们的计算机程序在运行的时候 数据就会临时存储在RAM中 如果不持久化 或着突然断电 它的数据就丢失了 2 ROM 只读存储 持久化存
  • css伪元素实现方框上面打钩

    html p class skill three con item frame p css skill three con item frame width 36px height 36px background transparent b
  • 深入浅出SQL(7)-ALTER

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 ALTER 改写历史 使用ALTER命令 可以修改表 对其套用新的设计方法 且不会影响现有数据 本章还会学到规范化的意义 我们要规范化我们的表 由于重新建了本地数据库
  • unity2d物理系统在安卓闪退的坑

    记录下2d物理系统安卓闪退的坑 之前的2d横版动作游戏和现在的幸存者游戏都出现过同样的问题 通过一步一步的排查 确定是Unity Project Setting Physics 2D Auto Sync Transfroms 这里勾选上的问
  • c盘清理

    https jingyan baidu com article ea24bc39ebefadda62b33180 html 转载于 https www cnblogs com zach0812 p 11557586 html
  • 神舟笔记本进入BIOS的方法

    最近整了一个i9 8950h的神舟笔记本 默认预装的是windows 10 总结一下进入BIOS的方法 方法一 重启电脑 黑屏的时候 不断按F2键 这个方法的优点是操作简单 缺点是有时候会进不去 直接进入桌面 方法二 系统设置 gt 更新和
  • IDEA工作常用快捷键

    ide快捷键 Intellij IDEA 移动光bai标du到行尾的快捷键是End Intellij IDEA 移动光标到行首的快捷键是Home Home End键的意思是开头 结尾 在记事dao本或word等其他文本工具中也有同样的效果
  • Java的Integer.valueOf()初窥

    前言 今天在做题时 碰到了一道选择题 就是关于Integer valueOf 的知识 题目如下 A System out println i01 i02 B System out println i01 i03 C System out p
  • js string转json有斜杠_详解json串反转义(消除反斜杠)

    JSon串在被串行化后保存在文件中 读取字符串时 是不能直接拿来用JSON parse 解析为JSON 对象的 因为它是一个字符串 不是一个合法的JSON对象格式 例如下面的JSON串保存在文件中 读出来不能直接解析 resourceId
  • C++类模板的特化(三)

    本文主要介绍类模板的特化 局部特化和缺省模板实参 1 类模板的特化 类模板的特化 Class Template Specialization 是指为特定的模板参数提供自定义实现的过程 通过特化 我们可以针对某些特定的类型或条件提供不同的行为