到底什么是type traits

理解C++ Type Traits 在 C++中, Type Traits(类型特性)是一组模板类和函数, 它们提供了一种在编译时查询, 修改和操作类型信息的机制. Type Traits 是 C++ 标准库 `<type_traits>` 头文件的核心内容, 它利用了模板元编程(Template Meta Programming)的技术, 允许程序在编译时进行类型检查, 类型转换和类型选择等操作, 从而提高代码的安全性, 性能和灵活性. 阅读详情

rType Traits 是c++模板编程中使用的比较巧妙的一种技术,这种技术可以让你获取或者转换模板的类型属性。

我们从一个具体的需求开始分析,我们想在一个模板函数中获取模板的具体类型,针对不同的具体类型,有一些特殊的处理。

比如:一个模板函数 template<typename T> void decode(const T& data,char* buf),我们允许这个函数在不同的类型实例化的时候,有不同的处理。

template<typename T> void decode(const T& data,char* buf)
{
   switch(T):
    {
        case "int":
            cout<<"int"<<endl
            break;
        case "float":
            cout<<"float"<<end;
        break;
        ...
        default:
            cout<<"unknow customed type";
            break;
    }

}

我们先定义类型列表:

enum Type {
  TYPE_1=1,     //Foo
  TYPE_2,       //int
  TYPE_3,   // float
  TYPE_4    // unknown
};

然后再创建一个模板类,等模板类实例化的时候,里面包含实例化的类型。比如说,如果用int来为T实例化的时候,我们的type就赋值为TYPE_2,依次类推。

template <typename T>
struct type_traits
{
    public:
     static const Type type=T::type;
};

我们把这个类模板引入到我们的模板函数中:

template<typename T>
void decode(const T& data,char* buf) {
    switch (type_traits<T>::type)
    {
        case Type::TYPE_1:
            cout<<"Foo"<<endl;
            break;
        case Type::TYPE_2:
            cout<<"int"<<endl;
            break;
        case Type::TYPE_3:
            cout<<"float"<<endl;
            break;
        default:
            cout<<"unknown"<<endl;
            break;
    }

}

模板的类型既有系统内置的类型,比如 int,float,也有我们自己定义的类型,比如Foo和Bar等。

我们对内置类型进行类模板的偏特例化,这样模板函数中的type_traits<T>::type变量就对应这两个特例化中的type类型

template<>
struct type_traits<int> {
  static const Type type = Type::TYPE_2;
};
template<>
struct type_traits<float> {
  static const Type type = Type::TYPE_3;
};

那么如果类型是我们自己定义的类型,我们该如何描述各自的类型:比如Foo和Bar类分别制定为TYPE_3和TYPE_4.

class Foo {
public:
   static const Type type = Type::TYPE_1; 
};
class Bar {
public:
   static const Type type = Type::TYPE_4; 
};

以Foo为例,type_traits模板类就会特例化为如下代码,static const Type type=Foo::type=Type::TYPE_1;

template <>
struct type_traits<Foo>
{
    public:
     static const Type type=Foo::type;
};

如此就巧妙地把内置类型和自定义类型使用同样的代码进行了处理,完整的运行代码如下:

#include<iostream>
using namespace std;
enum Type {
  TYPE_1=1,     //Foo
  TYPE_2,       //int
  TYPE_3,   // float
  TYPE_4    // unknown
};


template <typename T>
struct type_traits
{
    public:
     static const Type type=T::type;
};

class Foo {
public:
   static const Type type = Type::TYPE_1; 
};
class Bar {
public:
   static const Type type = Type::TYPE_4; 
};

template<>
struct type_traits<int> {
  static const Type type = Type::TYPE_2;
};
template<>
struct type_traits<float> {
  static const Type type = Type::TYPE_3;
};

template<typename T>
void decode(const T& data,char* buf) {
    switch (type_traits<T>::type)
    {
        case Type::TYPE_1:
            cout<<"Foo"<<endl;
            break;
        case Type::TYPE_2:
            cout<<"int"<<endl;
            break;
        case Type::TYPE_3:
            cout<<"float"<<endl;
            break;
        default:
            cout<<"unknown"<<endl;
            break;
    }
}
int main()
{
    char* p;
    Foo foo;
    decode(foo,p);
    Bar bar;
    decode(bar,p);
    int a;
    decode(a,p);
    float d;
    decode(d,p);
    return 1;
}

type_traits 称为类型萃取技术,主要用于编译期获取某一参数、某一变量、某一个类等等任何 C++相关对象的类型,以及判断他们是否是某个类型,两个变量是否是同一类型,是否是标量、是否是引用、是否是指针、是左值还是右值,还可以将某个为某个类型去掉 cv(const volitale)属性或者增加 cv 属性等等

从c++ 11开始,c++提供了大量的type_traits的模板类,来实现各种功能,具体请看Standard library header <type_traits> (C++11) - cppreference.com

企业数字化转型的 4A 架构指南:从概念解读到 TOGAF 阶段对应 4A企业架构是中国数字化转型实践中总结的简化框架,包含业务、应用、数据和技术四个架构层。它自上而下形成业务驱动应用的指导关系,自下而上构建技术支撑数据的实现路径,与国际标准TOGAF核心内容高度对应。该模型通过统一语言、战略对齐和系统梳理,有效连接业务需求与IT实施,已成为企业架构规划的实用工具。其分层结构清晰展示了从业务目标到技术落地的完整推导链,特别适合中国企业的数字化转型场景。 阅读详情

相关推荐

别再对着数据手册画图了!用HFSS 2023 R2快速复现ESP-01的PCB天线(附模型文件)

本文详细介绍了使用HFSS 2023 R2逆向复现ESP-01 PCB天线的五个关键步骤,包括逆向工程准备、高效建模技巧、材料与边界设置、激励与求解配置以及结果分析与设计验证。通过参数化建模和智能边界检测,大幅提升仿真效率,适用于WIFI和蓝牙设备的射频设计优化。

weixin_30832143的博客 76

C++11 类型支持之type traits

如果你是一个c++模板用户,大概率多多少少都接触过type traits这个概念,直译就是类型萃取,根据名字也能猜到是用于获取类型的,在c++ 11之前,stl就已经用到了相关技术了,比如迭代器使用相关的类型获取,《STL 源码剖析》有详细介绍,有兴趣的可以去看看。c++ 11更是引入了一个专门的头文件<type_traits>用来做type traits的相关事情,本篇就来聊聊type_traits。

wxj1992的博客 8655

VulnHub系列之BadStore_123渗透测试

BADSTORE: 1.2.3 早期网商系统漏洞鉴赏(2004)

Flynn的博客 1628

突破编程_C++_C++11新特性(type_traits的概念以及核心类型特性)

C++11 新特性:type_traits的概念以及核心类型特性

突破编程 2592

Unity面试题总结

Unity面试题

sinat_34014668的博客 1万+

Logisim实战:手把手教你搭建GB2312汉字字库(附完整电路图)

本文提供了一份详尽的Logisim实战指南,手把手教你如何利用存储芯片,通过位扩展和字扩展技术,构建一个完整的GB2312汉字字库。文章深入浅出地讲解了从编码原理、系统架构设计到具体电路实现与调试的全过程,是学习计算机组成原理和数字电路设计的绝佳实践项目。

k6l7m8n9的博客 808

C++模板元编程Type_traits

type_traits type_traits是C++11提供的模板元基础库。 type_traits可实现在编译期计算、判断、转换、查询等等功能。 type_traits提供了编译期的true和false。 // type_traits中源码 template &amp;lt;class T, T val&amp;gt; struct integral_constant { typedef i...

林多 1万+

AUTOSAR Dem模块实战配置:从理论到代码生成的完整指南

本文提供了一份AUTOSAR Dem模块从理论到代码生成的完整实战配置指南。文章详细拆解了配置流程,涵盖Dem模块的核心角色、通用骨架搭建、事件与DTC映射、消抖机制配置,以及与BswM、EcuM、DCM等模块的联调方法,旨在帮助汽车电子工程师快速掌握诊断事件管理的关键配置步骤,生成可运行的代码。

3c4x5z6v7b的博客 454

C++基础 | Type Traits

Type Traits是C++标准库中的一部分,定义在头文件中。它们提供了一种在编译时查询和操作类型信息的方式。Type Traits通常以模板类和模板变量的形式出现,用于检查类型的属性、转换类型或生成新的类型。

羽觞醉月11的博客 386

18006.STM32通过SPI读取LAN9253数据

【代码】18006.STM32通过SPI读取LAN9253数据。

写给自己的笔记 554

分享一个完整的KANO问卷(包含正反问题和选项设置)

本文介绍了KANO模型问卷的设计与应用,用于评估功能需求优先级。问卷包含基本信息、功能评估(正反问题设计)、界面评估及开放问题,选项定义明确(如"非常喜欢"到"很不喜欢")。数据清洗规则包括剔除矛盾回答和注意力检验。通过量化编码和矩阵分析,将需求分为魅力型、期望型、必备型等类别。示例数据显示健康监测为必备型(72%),电子围栏为期望型(45%),适老化改造为无差异型(38%)。该模型为产品决策提供客观量化依据。

从技术实践立足,从项目管理方法论延伸思考 1794

现代 C++ 中类型特征( type traits)的快速入门

类型特征是一个简单的模板结构,它包含一个成员常量,它又包含类型特征提出的问题或它执行的转换的答案。例如,让我们看一下C++ 标准库在``模板结构 is_floating_point;这个类型特征告诉一个类型是否T是浮点数。成员常量——value要求提出问题的类型特征——将被设置为true或false根据作为模板参数传入的类型。另一方面,例如,一个类型特征会改变T模板结构 移除参考;这种类型特征基本上变成T&了T. 成员常量——type。...

1363

lammps原子组速度的计算方法

在lammps摩擦、冲击、压痕等模拟过程中,涉及到某个原子组的整体移动,如果要输出这个原子组的整体移动速度,可以使用vcm()函数。下面是一个具体的使用案例,金刚石球在盒子内移动,输出移动过程中金刚石球在x方向的质心速度。vcm()是lammps自带的一个函数,返回原子组质心在设定方向的速度。其中,ID为group-ID,dim为方向,可设置x、y或者z方向。大家好,我是小马老师。

lammps_jiayou的博客 343

type_traits 类型萃取

一、 c++ traits traits是c++模板编程中使用的一种技术,主要功能: 把功能相同而参数不同的函数抽象出来,通过traits将不同的参数的相同属性提取出来,在函数中利用这些用traits提取的属性,使得函数对不同的参数表现一致。 traits是一种特性萃取技术,它在Generic Programming中被广泛运用,常常被用于使不同的类型可以用于相同的操作,或者针对不同类型提供不...

Jeff_的博客 1770

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

c++11 之type_traits

1.type_traits-类型萃取  (1)type_traits可以在一定程度上消除 switch-case 或者 if-else语句,降低程序的复杂度 (2)可以在编译期就检查出是否是正确类型 1.1基本的type_traits 定义编译期常量   struct GetLeftSize {    static const int value =1; } 或  st

lq123的博客 2064

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深入解析C++的type_traits

C++的type_traits是一套纯粹编译期的逻辑,可以进行一些类型判断、分支选择等,主要用于模板编程。使用type_traits并不难,但是我们希望能够更加深入了解其实现方式,与此同时,可以更进一步体验C++的模板编程。 本篇文章旨在引导大家自行实现type_traits的基础代码。 模板编程不像常规的代码,可以有if-else这些流控制语句,我们需要充分利用模板、模板特例、类型转换等特性来实现编译期的一系列判断和类型转换。 定义基础常量 第一步,我们需要定义true和false两个常量,所有的type

fl2011sx的博客 4096

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

type traits小总结

主要是阅读了侯捷老师的《stl源码剖析》的迭代器部分的内容,进行的一点总结: type traits是什么? 字面翻译,就是类型特点,顾名思义,就是某个类本身的特质。在下图中,迭代器是容器和算法之间的桥梁,而算法在调用使用数据的过程中,也需要知道这个数据或者说容器本身的性质。 迭代器中的type traits有哪些? template <class I> struct itera...

sinat_32165273的博客 542

type_traits学习

获取T的原始类型,我们通过std::remove_reference移除引用,需要获取智能指针指向的对象时需要对原始类型U添加左值引用。 #include <iostream> #include <type_traits> #include <memory> template <typename T> struct Const...

Lasuerte的博客 536

type traits和iterator traits

1、Type Traits是类型萃取机,是模板元编程的一个核心组件,它是一系列编译时的工具,允许程序员在编写模板代码时,查询/检测和修改类型的信息和属性。定义在<type_traits>头文件中。“镜子”:让你看到类型的属性(是什么?“手术刀”:让你基于这些属性对类型进行修改(去掉const,加上指针等)。4、修改类型(或者从一个类型获得另外一个类型,类型修改等)

zhangjian1234567890的专栏 139

C++ 标准库 <type_traits>

中定义了一系列编译期模板,用于对类型特性进行布尔查询(如是否为指针、是否可拷贝、是否为浮点型等),以及基于原始类型生成新类型(如添加/去除constvolatile、提取内置数组元素类型、替换void为nullptr_t等)。所有工具均在编译期计算,可用于 SFINAE、、模板元编程和泛型库设计,提升类型安全性与灵活性。

m0_57545130的博客 1168

C++11标准库之Type Traits简介

在C++11中,typetraits是一项非常有意思的特性。

加肥猫garfee的专栏 5903

Traits编程技法之type_trait

STL对于性能的要求非常的严格,任何一点无意义的操作都会严重影响其中容器或算法的性能,即使只是一条语句。在高频率的使用下,这种浪费将会无限扩大。type_traits的作用之一就是提高性能。 当我们在进行对象的析构(destroy)操作时,如果对象为内置对象(如int,char,float,pointer)或其数据成员包含内置对象,因为其析构操作由编译器内置执行,所以我们对其进行析构函数的调用是

J.的学习室 2440

type_traits

概述 type_traits提供了丰富的编译期间计算、查询、判断、转换和选择的帮助类,其被定义在#include <type_traits>下。 作用: 增强了泛型编程能力; 增强程序的弹性,使得在编译期间就可以做到优化、改进甚至排错,提高代码质量; 它所提供的选择功能一定程度上可以消除冗长的if-else或switch-case语句,降低程序的圈复杂度,提高代码的可...

Nemo 2964

type_traits技术与C++

引言 一个方法实现过程中,业务逻辑很多都是相似的,但是与具体的特化类型的不同有一定的差异。 这个时候可以采用特化模板的方式实现,不同的类型使用不同的特化实现。但是这种情况造成一定的业务逻辑的冗余。而trait技术可以将特化类型通过封装,以一个统一的调用方式实现相同的业务逻辑。 Type_traits技术 type_traits可以翻译为类型提取器或者类型萃取器,很直白的说就是通过这个机制可以获取被...

DeepIndeed 556

C++:SGI STL——__type_traits

C++STL:__type_traits类型萃取

Sauron7i的博客 1057

C++ type_traits 原理

一、简单介绍 (1)、type_traits 类型萃取,C++11中已经成为了一个核心模块。 (2)、标准库包括helper classes 、type traits、type transformations 三个模块。 ...

950
上一篇: 左值/右值/左值引用/右值引用/万能引用/移动语义/完美转发,你真的懂了吗?
下一篇: 函数模板为什么没有偏特化?
SONG_CA
博客等级 码龄24年 74粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值