Qt中的C++技术 学习总结:(3)类型分类(Type Classification)技术

2023-11-18

       设一个模板具有模板参数T,表示C++中的某种类型。有些情况下,随着T所取类型的不同,该模板会做不同的处理。在设计该模板时,我们需要了解T的具体信息。在编写一个具有模板参数T的类模板时,有时需要了解T所取类型的具体信息,以做不同的处理。这是一个棘手的问题,因为C++语言只有很少几个运算符能够处理“类型”:sizeof、dynamic_cast以及typeid。和我们想要获取的类型信息相比,这些运算符提供的信息太少。运算符sizeof只能够求取一个类型的对象所占用的内存空间。对于含有虚函数的类,dynamic_cast可被用来判断一个对象是否具有某个类型,但是这个运算符只能施加到一个指针(或引用),不能施加到一个类型。运算符typeid倒是适用于所有类型(或者这些类型的对象),但是它只能获得一个类型的名字信息。

    既然C++本身不能够提供足够详细的信息,我们可以使用类模板特化技术,设计专门的类模板来提供所需信息,这种方法被称为类型分类(typeclassification)技术。我们以一个具体的例子来说明这种技术的原理。设想这样一个任务:模板参数T是指针类型、引用类型或者数组类型中的某一种,我们需要判断T究竟是其中的哪一个。如果是指针类型,需要知道该指针所指的类型,并将其命名为baseT。还需要知道该类型最终涉及哪个C++基本类型,并将其命名为bottomT。比如,对于指针类型int * *,baseT为int *,而bottomT为int。类似地,对于引用类型,baseT表示所引用的类型,bottomT表示该引用类型最终涉及哪个C++基本类型。比如,对于类型double * &,baseT为double*,bottomT为double。对于数组类型,baseT表示数组元素的类型,bottomT表示该数组类型最终涉及哪个C++基本类型。比如,设有数组类型typedef int * arrayType[100],baseT为int *,而bottomT为int。类模板特化技术可解决这个问题。如代码段,主类模板定义了一组枚举常量,每个枚举常量的取值表示模板参数T是否具有对应的类别。比如,IsPtrT为1则表示T是指针类型,为0则表示T不是指针类型。

#ifndef TYPECLASSIFICATION_H
#define TYPECLASSIFICATION_H


// Type Classification 类型分类技术
/**
  * sizeof()   能够求取一个类型的对象所占用的内存空间
  * dynamic_cast  对于含有虚函数的类,可被用来判断一个对象是否具有某个类型,但是这个运算符只能施加到一个指针(或引用),不能施加到一个类型
  * typeid()  适用于所有类型(或者这些类型的对象),但是它只能获得一个类型的名字信息
  */


// 主类模板
template <typename T>
class TypeInfo{
public:
    enum{IsPtrT = 0,IsRefT = 0,isArrayT = 0};
    typedef T baseT;
    typedef T bottomT;
};

// 特化类模板==>指针
template<typename T>
class TypeInfo<T*>{
  public:
    enum{IsPtrT = 0,IsRefT = 0,isArrayT = 0};
    typedef T baseT;
    typedef typename TypeInfo<T>::bottomT bottomT;
};

//特化类模板==》引用
template<typename T>
class TypeInfo<T&>
{
public:
    enum{IsPtrT = 0,IsRefT = 0,isArrayT = 0};
    typedef T baseT;
    typedef typename TypeInfo<T>::bottomT bottomT;
};

// 特化类模板==》数组
template <typename T,size_t N>
class TypeInfo<T[N]>
{
public:
    enum{IsPtrT = 0,IsRefT = 0,isArrayT = 0};
    typedef T baseT;
    typedef typename TypeInfo<T>::bottomT bottomT;
};


#endif // TYPECLASSIFICATION_H

      这种使用模板特化技术来描述模板参数T的类型信息的技术即被称为类型分类(type classification)。类型分类技术和traits技术很相似:都是利用模板特化技术描述一个类型的具体信息。但是二者的侧重点有所不同,类型分类侧重于描述一个类型的类别信息,比如它是否是指针、数组等,而traits技术侧重于描述一个类型的具体信息,比如浮点数的表示范围、精度等。

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

Qt中的C++技术 学习总结:(3)类型分类(Type Classification)技术 的相关文章

  • Qt信号和信号槽(二)

    目录 信号槽使用拓展 示例1 一个信号可以对应多个槽函数 在上篇文章的代码中进行修改 示例2 用信号连接信号 信号槽的连接方式 示例 Lambda表达式 语法格式 定义和调用 信号槽使用拓展 一个信号可以连接多个槽函数 发送一个信号有多个处
  • Visual Studio 2015 + cmake编译QT5程序

    概述 由于QT的集成开发环境QTCreate 在代码调试功能上远不及Visual Studio方便 因此 在Windows平台 可以使用Visual Studio来开发调试QT程序 本文章就主要介绍下 如何使用CMAKE编译QT5程序 并使
  • QString : 类型转换,不留神就留坑?

    QString作为Qt中内置的数据类型 功能强大且使用方便 绝对是在Qt开发过程中出场率最高的数据类型 本篇我们只重点探讨下QString转换成其他数据类型的注意事项 short toShort bool ok nullptr int ba
  • Qt——打开QT项目时只有.pro文件,头文件、源文件都不见了(涉及高低版本Qt的Kits工具,Could not find qmake spec ‘default‘.Error while par

    注意 若转载 请贴上链接 https blog csdn net qq 41042595 article details 126244047 如若发现抄袭或未标明来源现象 都可举报反馈 文章目录 前提 问题的由来 问题分析 回想 解决方案
  • Qt5 报错笔记

    使用QSound类 步骤 1 pro文件中加入 QT multimedia 2 窗体 h文件中加入QSound类的指针 QSound sound 私有对象 3 窗体 cpp文件中构造函数进行音乐播放 QString runPath QCor
  • QString,const char*,char*相互直接转换方法

    整合网络上的解决方法 解决方法一 1 string转const char string s abc const char c s s c str const char 转string 直接赋值即可 const char c s abc st
  • 关于Qt和C++中的反射机制实现与运用(2)

    看到一个很好的实例 这里就转载过来了 原文地址 C 反射机制 一 前言 Java有着一个非常突出的动态相关机制 Reflection 用在Java身上指的是我们可以于运行时加载 探知 使用编译期间完全未知的classes 换句话说 Java
  • Qt里的信号与槽原理

    一 什么是信号与槽机制 信号和槽 Signal Slot 用于两个对象 object 进行交流 通俗地来说 就是一个对象发出什么信号 另一个对象执行相应的动作 比如跑步比赛中 裁判员发出枪响信号 运动员开始起跑 信号 Signal 相当于发
  • Qt概述和项目文件介绍

    注意 学习本专栏的内容需要了解C 相关知识 会涉及到C 基础语法和相关特性 可以参考我的另一个专栏 c 从零开始 小梁今天敲代码了吗的博客 CSDN博客 目录 一 什么是Qt 二 Qt的案例 三 项目文件介绍 一 什么是Qt 是一个跨平台的
  • Qt中的窗口类及其特点

    目录 常用的窗口类 窗口的显示内嵌窗口 QWidget内嵌窗口演示 QWidget不内嵌窗口演示 QDialog类型的窗口特点 QMainWindows窗口的特点 总结 常用的窗口类 常用的窗口类有 3 个 在创建 Qt 窗口的时候 需要让
  • Qt项目实战 杂谈一二:中文乱码事情小,处理不好头发少

    Qt开发者来说 特别是初学者 往往最头疼的是编码的问题 举个例子 1 控件上设置中文标签 发现显示出来是乱码 怎么解决 如果标签是常量字符串 含中文 怎么处理 如果标签是变量 且可能包含字符串 又咋处理 2 Qt应用与其他应用存在进程间交互
  • Qt封装HTML网页及数据交互(通信)

    看到网上有个关于Qt封装网页的例子 CSDN下载需要50积分 我呸 其实也是人家Qt官网给的demo 然后改了一丢丢而已 既然这样 那我也实现一下 而且提供源码 环境 Qt5 13 MSVC 要点 Qt GUI QWebEngine QWe
  • Qt 在主界面程序中,调用子界面(另一个界面)的控件

    问题 在主界面程序mainwindow cpp中 想调用子界面 另一个界面 上的控件 已经在 pro工程中添加好了一个设计师界面类作为子界面 这里我在工程中添加的是show netlist dialog cpp h ui 解决步骤 1 在子
  • 利用Qt实现Gif转预览图片

    利用Qt实现Gif转预览图片 项目介绍 一个简易的Github图床客户端 项目仓库 GithubImageHost 需要把图床的gif搞成本地的预览图片 本来当会很麻烦 看了下QMove的源码 原来直接用QImageReader就可以实现g
  • Qt中查看ui_xxx.h文件方法

    前提 1 Qt当有界面 2 构造完成 满足以上两个条件qt会生成ui xxx h文件 如何查看 方法1 在cpp文件中找到UI下的一个对象 如 ui gt textEdit Ui QWDialog 按住Ctrl键 使用鼠标左键点击UI下的一
  • Qt——(详细)“项目在Debug构建环境下能运行而在Release构建环境下不能运行”解决方案之一,以及 禁用(黄色)警告

    系列文章目录 提示 文章目录 系列文章目录 前言 环境 一 问题 准备工作 为了在Release环境下可以进行断点调试 分析 二 解决 1 根据需求 对函数类型进行更改 2 根据需求 在函数内添加 return int 延伸 禁用警告 消除
  • Qt5打包——利用自带的windeployqt.exe和工具Enigma Virtual Box

    目录 运行 添加依赖 发布成单一exe形式 运行 选择Release版本 运行一次 Release 运行后会发现多了Release版本 里面有exe 但是双击时会发现缺少一些动态链接库 直接点击后缺少动态链接库 添加依赖 在你的Qt的安装包
  • QT 编译报错“QWidget: Must construct a QApplication before a QWidget”

    一 错误原因 1 在构造QApplication之前创建了部件 某个类或者其子类中采用了静态的qWidget或者其子类 由于静态或者全局对象在 main 之前就产生了 所以 早于main 里的QApplication对象 2 混用 debu
  • Qt智能指针之QScopedPointer

    内存释放的问题是C 中比较头疼的问题 合理的使用智能指针能有效的帮助我们减少忘记释放内存 导致的内存泄露问题 本文以Qt中的QScopedPointer为例 通过讲解其用法 从源码深度剖析其实现方式 QScopedPointer的使用原理比
  • Qt6.2.3 QWebEngineView 咋就默认无痕浏览模式了?

    最近项目从Qt5迁移到Qt6 有若干不兼容或者变动的地方 虽谈不上什么血泪史 但是一天内做了几十处的兼容性处理 好在项目不大 也是挺累人的 本文重点说说QWebEngineView 咋就默认变成无痕处理模式了 如何咱们如何取消无痕模式 自定

随机推荐

  • .net 和 java 技术对应关系

    net 和 java 技术对应关系 java 生态的优势早已人尽皆知 asp net core 的生态也呈欣欣向荣之势 作为高级技术从业人 你不应该落下任何一门技术 如果你正在将你的 java 知识体系同步到 net 或者正在将你的 net
  • T-Kernel Data types

    来自 uT Kernel 2 0 Specification 3 1 1 General Data Types typedef signed char B signed 8 bit integer typedef signed short
  • 项目-STL空间配置器

    这篇博客主要讲一下SGI STL中的空间配置器的工作流程 一 项目背景 小块内存带来的内存碎片问题 外碎片问题 小块内存频繁申请释放带来的性能问题 二 空间配置器的思想 对于我们来说 对new和delete很熟悉 这两个函数可以分别完成内存
  • 运放中接电阻的作用

    一 基本概念 运放的基本组成 运算放大器的内部电路结构如下所示 一般由输入段 增益段 输出段等3段电路构成 输入段由差分放大段构成 用于放大两个引脚间的电压差 另外 同相信号成分 引脚间无电位差 输入相等电压的状态 不放大 起抵消作用 若仅
  • 数学期望、信息量、信息熵、相对熵、交叉熵

    1 数学期望 数学期望就是总体的均值 或者各项的加权平均 先看离散的情况 假设X为离散型随机变量 x1 x2 x3 xk为随机变量的所有可能取值 p1 p2 p3 pk为随机变量相应取值发生的概率 其中p1 p2 p3 pk 1 那么随机变
  • 安装gin失败或卡住,亲测有效!

    安装gin失败或卡住 亲测有效 本人基于最近学习完了go所有语法 对go框架进一步学习与实战 但第一步的安装就遇到了坑 也是坑了很久 网上很多的方法 但是都乱七八糟 最主要一点毛线用都没有 柳暗花明又一村 功夫不负有心人 还是让我找到了解决
  • 电阻噪声的基础知识和一个有趣的小测试

    作者 TI 专家 Bruce Trump 翻译 TI信号链工程师 Tom Wang 王中南 放大电路的噪声性能受到输入电阻和反馈电阻Johnson噪声 热噪声 的影响 大多数人似乎都知道电阻会带来噪声 但对于电阻产生噪声的细节却是一头雾水
  • PHP对二维数组里面的多字段进行排序

    PHP对二维数组里面的多字段进行排序
  • 500 G JAVA视频网盘分享(JEECG开源社区)

    500 G JAVA视频网盘分享 JEECG开源社区 涵盖从java入门到深入架构 Linux 云计算 分布式 大数据Hadoop ios Android 互联网技术应有尽有 转载 http blog csdn net zhangdaisc
  • 标识符、变量与赋值语句1

    2 2标识符 变量与赋值语句 2 2 1标识符 标识符就是一个名字 就好像我们每个人都有属于自己的名字 它的主要作用就是作为变量 函数 类 模块以及其他对象的名称 Python 中标识符的命名不是随意的 而是要遵守一定的命令规则 比如说 1
  • delete LEFT JOIN 的一个问题解决办法

    LEFT JOIN 的一个问题解决办法 今天在一个程序后台删除一个东西的时候 却出现了这个问题 Java代码 System Message MySQL Query Error User admin Time 2007 10 20 21 08
  • ubuntu18.04桌面卡住鼠标可以动 键盘失效

    大多数是在启动chrome 或者开机后几分钟内频繁操作 直接卡死 鼠标可以移动但是无法点击 视频播放有声音但画面卡住 键盘在显示界面上没有操作效果 我挂了一晚上还是这样 强制重启 crtl alt prtsc r e i s u b ubu
  • ts中定义类、类的继承、修饰符

    首先 简单介绍ES6的class类 class Foo constructor name age 实例前的构造函数 实例添加name age属性 this name name this age age getName 原型添加getName
  • linux查找postgre进程,postgresql数据库某一个进程占用大量CPU,问题排查详解

    postgresql某一个进程占用大量 CPU 问题排查 目前服务器cpu为4核 内存8G 1 查下是不是我们的业务SQL SELECT procpid START now START AS lap current query FROM S
  • Linux——在Linux系统上安装和启动MinIO

    Linux 在Linux系统上安装和启动MinIO 下载 MinIO 赋予它可执行权限 运行 优化 将 minio 添加成 Linux 的服务 使用 systemctl 启停 minio 下载 MinIO 使用以下命令 将 data 替换为
  • 经典卷积神经网络AlexNet原理详细介绍

    ImageNet Classification with Deep Convolutional Neural Networks 这篇文章的网络是在2012年的ImageNet竞赛中取得冠军的一个模型整理后发表的文章 作者是多伦多大学的Ale
  • Ogre引擎源码——资源之Skeleton

    Ogre引擎源码 资源之Skeleton 分类 OGRE 游戏开发 引擎开发 图形引擎 游戏引擎 2012 09 21 06 17 1231人阅读 评论 0 收藏 举报 引擎 animation vector binding pointer
  • Google C++编程规范 (中文版)

    点击下面的超级链接即可 Google 开源项目风格指南 C 风格指南 内容目录 0 扉页 0 1 译者前言 0 2 背景 1 头文件 1 1 Self contained 头文件 1 2 define 保护 1 3 前置声明 1 4 内联函
  • ubuntu2004 搜狗输入法

    按照这个帖子搞就行了 Ubuntu20 04LTS安装搜狗输入法
  • Qt中的C++技术 学习总结:(3)类型分类(Type Classification)技术

    设一个模板具有模板参数T 表示C 中的某种类型 有些情况下 随着T所取类型的不同 该模板会做不同的处理 在设计该模板时 我们需要了解T的具体信息 在编写一个具有模板参数T的类模板时 有时需要了解T所取类型的具体信息 以做不同的处理 这是一个