C++模板特例化

2023-11-09

模板是用来写一些独立化特定类型的代码,但是对于有些类型,在处理时,细节上却有所差别,常见的如char*

如,现在你打算写一个栈,可以用于任何数据类型,那你肯定首先想到的就是模板啦

template<typename T>
class Stack
{
public:
       void push( const T &T);
        void pop( void);
};

但是如果你用char*去实例化Stack类,那多半会出问题吧,如;

Stack<char*> s;

char *p  = “fdjfjlaj";

s.push(p);

s.push(p);

那你每次push进去只是一个地址,这可能不是想要的吧,这是,你就需要对于char*进行特化,特例化后的类如下

template<>
class Stack<char*>
{
    void push(const char *p);
    void pop(void);
};

void Stack<char*>::push(const char*p)
{
}

void Stack<char*>::pop(void)
{
}

 

一下是一个完整的例子,环境:VS2008

//模板类
template<typename T>
class A
{
private:
    T data;
public:
     A(void):data()
     {
        cout << "A(void)" << endl;
     }
     ~A(void)
     {
        cout << "~A(void) : " << data << endl;
     }
   
     A(const T &t)
     {
          data = t;
          cout << "A(const T &t)" << endl;
     }
     A& operator = (const A &a)
     {
          data = a.data;
          cout << "A& operator = (const A &a)" << endl;
     }
     A(const A &a)
     {
          *this = a;
       
          cout << "A(const A &a)" << endl;
     }
};

//用char*特例化模板类A
template<>
class A<char*>
{
private:
    char *data;

    void free_data(void);
public:
     A(void);
     ~A(void);
     A( const char *p);
   
     A<char*>& operator = (const A<char*> &a);
     A<char*>& operator = (const char* p);
     A(const A &a);
};

//定义特例化类A<char*>的成员函数
A<char*>::A(void)
{
     data = new char[1];
     *data = 0;
     cout << "class A<char*>::A(void)" << endl;
}
A<char*>::~A(void)
{
     cout << "class A<char*>::~A(void) : " << data <<endl;
   
     if( NULL != data)
     {
          delete[] data;
          data = NULL;
     }
}

A<char*>::A(const char*p)
{
     cout << "A<char*>::A(const char*p)" << endl;
     int len = 0;
     if( NULL != p)
     {
        len = strlen(p);
     }
   
     data = new char[len+1];
    
     if( 0 != len)
     {
        memcpy(data, p, len);
     }
    data[len] = 0;
}

void A<char*>::free_data(void)
{
     if( NULL == data)
     {
        return;
     }
     delete[] data;
     data = NULL;

}
A<char*>& A<char*>::operator = (const A& a)
{
     cout << "A<char*>& A<char*>::operator = (const A& a)"<<endl;
     if( this == &a)
     {
        return *this;
     }
   
     return (*this = a.data);
 
}

A<char*>& A<char*>::operator = (const char* p)
{

     cout << " A<char*>& A<char*>::operator = (const char* p)" << endl;
     if( NULL == p)
     {
        return *this;
     }
   
     free_data();
     int len = strlen( p);
   
     data = new char[len+1];
     memcpy( data, p, len);
     data[len] = 0;
   
     return *this;

}

A<char*>::A(const A &a)
{
    *this = a;
}

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

C++模板特例化 的相关文章

随机推荐

  • CentOS下载ISO镜像的方法

    目录 一 CentOS 介绍 二 进入CentOS 官方网站 三 步骤 一 CentOS 介绍 CentOS 中文意思是社区企业操作系统是Linux发行版之一 是免费的 开源的 可以重新分发的开源操作系统 CentOS Linux发行版是一
  • JDK1.8新特性——lambda表达式和函数式接口

    一 lambda表达式 1 概念 Lambda表达式时一种特殊的匿名内部类 语法更加简洁 Lambda表达式允许把函数作为一个方法的参数 函数作为方法参数传递 将代码像数据一样传递 这里的匿名内部类的理解 我们可以在下述情况中来帮助大家了解
  • 服务器运行多个安卓系统,一台服务器可以做几个云手机

    一台服务器可以做几个云手机 内容精选 换一换 本文介绍使用云手机服务时需要了解的基本概念 云手机是一台包含原生安卓操作系统 具有虚拟手机功能的云服务器 简单来说 云手机 云服务器 Android OS 您可以远程实时控制云手机 实现安卓AP
  • linux 批量解压gz文件夹,linux 批量解压gz bz2文件

    一 批量解压bz2文件 find maxdepth 1 name bz2 xargs i tar xvjf 这条命令可解压当前目录下的所有bz2文件 批量解压是比较郁闷的事 以前尝试各种方法 甚至用脚本循环语句解压都不行 现在发现这条命令可
  • JSON对象转换成Byte(字节)数组

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 如果你不了解JSON对象 请看这里 JSON对象转换成 byte 数组 Byte byteArray Byte jsonData bytes NSLog s byteArr
  • 如何追踪泄漏者信息?软件保护工具VMProtect独有水印快速锁定目标!

    VMProtect是一种很可靠的工具 可以保护应用程序代码免受分析和破解 但只有在应用程序内保护机制正确构建且没有可能破坏整个保护的严重错误的情况下 才能实现最好的效果 VMProtect提供了一种独特的功能 可以将有关受保护文件所有者的隐
  • 基于Python的微博大数据舆情分析,舆论情感分析可视化系统

    运行效果图 基于Python的微博大数据舆情分析 舆论情感分析可视化系统 系统介绍 微博舆情分析系统 项目后端分爬虫模块 数据分析模块 数据存储模块 业务逻辑模块组成 先后进行了数据获取和筛选存储 对存储后的数据库数据进行提取分析处理等操作
  • LeetCode 541. 反转字符串 II

    题目链接 https leetcode cn problems reverse string ii C 代码如下 class Solution public string reverseStr string s int k int n s
  • vant ui Swipe pc端滑动失效

    这里我使用了vant的Swipe组件 由于vant是移动端的组件库 对pc端会有兼容性问题 例如Swipe 移动端是 touch 该组件做了相应的监听 而PC端是 mouse 没有做对应的监听 因此在pc端无法用鼠标拖动图片 1 安装插件
  • redis BITFIELD详解

    支持子命令和整型 本命令会把Redis字符串当作位数组 并能对变长位宽和任意未字节对齐的指定整型位域进行寻址 下面是已支持的命令列表 GET
  • MYSQL深入学习(一)

    1 mysql 体系结构 连接池组件 管理服务和工具组件 sql接口组件 查询分析器组件 优化器组件 查询缓存组件 插件式存储引擎 mysql的特点 可以根据需求 动态的配置存储引擎 物理文件
  • idea控制台输出中文乱码解决

    解决Intellij IDEA控制台logger info system out println等中文乱码问题 一 编写环境乱码 二 控制台打印乱码 又包含3种 当我们使用Intellij IDEA开发时 首当其冲就是中文乱码问题 造成中文
  • unity物体范围内随机生成

    这个脚本需要挂载到需要随机生成的物体上 但不能是空物体 using System Collections using System Collections Generic using UnityEngine public class Ran
  • CDN回源原理和CDN多级缓存

    一 CDN概念 CDN的全称是Content Delivery Network 即内容分发网络 其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节 使内容传输的更快 更稳定 CDN是通过在网络各处放置节点服务器所构成的
  • STL案例——评委打分案例

    有5名选手 选手ABCDE 10个评委分别对每一名选手打分 去除最高分 去除评委中最低分 取消平均分 1 创建五名选手 放到vector中 2 遍历vector容器 取出每一个选手 执行for循环 可以把10个评分打分存到deque容器中
  • Rxjs在Angular中的简单应用

    Angular中集成了Rxjs库 Rxjs是javascript的一个响应式编程库 它提供了很多api 可以很方便的处理和操作应用中的数据 我们在自己的angular项目中新建一个组件 ng generate component rx bu
  • Java多线程两种实现

    在java中实现多线程的方式有两种 一种是继承Thread类 另一个是实现Runnable接口 对于两种实现 各有优缺点 接下来进行对比总结一下 这两种方法 都可以实现多线程 以下为两种实现的写法 继承Thread类的方式 package
  • 五、语言特性之<=default,=delete、using、noexcept、override、final、以及和const对比>

    目录 一 default delete 1 首先我们要回顾一下编译器提供的默认函数 2 何时需要自定义big three 构造函数 拷贝构造 拷贝赋值 big five 新增移动构造函数 移动赋值函数 3 default delete关键字
  • Yearning做SQL审核

    系统环境 Centos7一 Inception安装 1 安装相关依赖包 yum install bison ncurses libs libncurses5 devel ncurses devel wget git cmake openss
  • C++模板特例化

    模板是用来写一些独立化特定类型的代码 但是对于有些类型 在处理时 细节上却有所差别 常见的如char 如 现在你打算写一个栈 可以用于任何数据类型 那你肯定首先想到的就是模板啦 template