首页 > 编程语言 >C++ Traits的笔记

C++ Traits的笔记

时间:2023-04-11 20:33:52浏览次数:50  
标签:traits C++ value Traits 笔记 func 类型 type 模板

traits意思为特性,特点
在C++中用于提取类型信息
#include<type_traits>
type_traits库中有std::is_same可以判断两个类型是否相同

先看一下使用模板提取类型信息,就是多做一层封装
在使用模板的过程中
假设函数中有必要声明一个变量,要和迭代器所指向的对象类型相同

template <class I, class T>
void func_impl(I iter, T t) {
        T tmp; // T就是得到的类型信息
}

template <class I>
inline void func(I iter) {
        func_impl(iter, *iter); // 传入iter和iter所指的值,class自动推导
}

int main() {
    int i;
    func(&i);
}

func_impl就得到了迭代器的类型T,因为func中降迭代器iter所指的值传给了func_impl
但这种方式无法推导函数的返回值类型,有时我们在写代码时,函数前面的返回类型要确定为某个类
对于返回值如何推导?看看模板偏特化的神通

一个解决方法是,在定义类时,内嵌类型声明

template <class T>
struct ABC{
    typedef T value_type; // 内嵌类型声明
    // ...
};

但原生指针不是类别,无法内嵌类型信息,所以要对原生指针类做一个模板特化

由模板的偏特化,不同类型匹配不同的模板实现
如下代码所示,指针类型的变量会匹配指针偏特化的模板
利用这一点,对关心的几种类型做偏特化,就可以将某个类型的对象匹配到对应的模板实现上
而类型信息在这种情况下就是已知的了

 //自定义的类内部需要内嵌value_type变量
 template <class T>
 struct iterator_traits {
     typedef typename T::value_type value_type;
 };
 
 //模板偏特化,指针类型
 template <class T>
 struct iterator_traits<T*> {
 //指针类型匹配在此,value_type就正确对应到指针的类型T了,而不是T*
     typedef T value_type;
 }; 

 template <class T>
 typename iterator_traits<T>::value_type func(T it) {
     return *it;
 }

func(T it)传入实参时,该函数的返回值是iterator_traits<T>::value_type
T为实际类型,会和模板类iterator_traits进行匹配(模板实例化,但没有创建iterator_traits结构体变量),value_type会获得正确的类型
从而返回值的类型也推导出来了
普通的类中需要定义好value_type,指针类别无需

参考了这篇文章,写得不戳 https://www.cnblogs.com/mangoyuan/p/6446046.html

标签:traits,C++,value,Traits,笔记,func,类型,type,模板
From: https://www.cnblogs.com/lxzbky/p/17233287.html

相关文章

  • Cadence应用笔记:修改PCB层叠
    说明软件设计PCB时默认是设置为两层板,如果要添加层叠,可以打开Crosssection选项打开后选择add新层即可,添加后默认是dielectricPP层,需要修改为Plane平面层(或者conductor走线层,两者并无本质区别)其他的一些参数为板厚之类设置,可以用来做阻抗计算,但实际还是以打板用的材质为准......
  • 【论文阅读笔记】Learning to Prompt for Continual Learning
    Create_time:April27,20225:21PMEdited_by:HuangYujunOrg:GoogleResearch,NortheasternUniversityLearningtoPromptforContinualLearning[38]LearningtoPromptforContinualLearning.pdf问题:最终输入transformerencoder的序列长度是怎么组成的,原始......
  • C++第二天
    计算正五边形的周长和面积#include <bits/stdc++.h>using namespace std;int main(){    double n,S,C;    double a,b;    cin>>n;    a=sqrt(5);    b=25+10*a;    S=sqrt(b)/4*n*n;    cout<<S<<endl;    C=5*n;    cout<<C<<endl;......
  • 【论文阅读笔记】Distiling Causal Effect of Data in Class-Incremental Learning
    Author:HanwangZhang,XintingHuCreate_time:April24,202211:01AMEdited_by:HuangYujunPublisher:CVPR2021Org:NanyangTechnologicalUniversityDistilingCausalEffectofDatainClass-IncrementalLearning1.Contribution这是一篇从因果角度思考持续......
  • 【论文阅读笔记】iCaRL: Incremental Classifier and Representation Learning
    Author:AlexanderKolesnikovKey_words:nearest-mean-of-exemplarrule,prioritizedexamplerselection,representationlearningCreate_time:September11,20213:06PMEdited_by:HuangYujunPublisher:CVPR2017Score/5:⭐️⭐️Status:FinishediCaRL:Incre......
  • ros-python学习样例笔记
    1.通信基本原理介绍待写2.三种通信方式的程序样例(python版)2.1topic通信方式(非自定义和自定义)2.1.1创建工作空间和topic功能包在ubuntu中打开命令行,输入下面的命令创建并初始化工作空间,一定要回到XXX_ws的目录下初始化工作空间#创建工作空间文件夹my_ros(一般命名......
  • 学习笔记396—自定义Docker镜像推送到Docker Hub实战
    自定义Docker镜像推送到DockerHub实战云原生探索的必经之路—容器化,而容器化目前最主流的技术莫过于Docker了,因为之前也大量的输出过Docker相关的技术博客,如果感兴趣的话可以直接访问专栏:​​《探索云原生》​​,按需学习哦。这篇文章还是从Docker入手,从0开始讲述下如何将自己的D......
  • #yyds干货盘点 前端小知识点扫盲笔记记录2
    前言大家好我是歌谣今天继续进行前端知识的一些总结想加入前端巅峰交流群私信我innerHTML和innerText的使用<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge">......
  • C++创建线程
    C++11中使用std::thread来创建线程。一、创建线程#include<iostream>#include<thread>#include<mutex>/*函数指针创建线程*/voidthread_func(intsize){std::cout<<"thread_func:"<<std::this_thread::get_id()<<std::en......
  • C++第二章课后练习题 2-24,2-25
    编写一个完整的程序,实现功能:向用户提问“现在正在下雨吗?”,提示用户输入Y或N。若输入为Y,显示“现在正在下雨。”;若输入为N,显示“现在没有下雨。”;否则继续提问“现在正在下雨吗?”。#include<iostream>usingnamespacestd;intmain(){cout<<"现在正在下雨吗?"<<endl;......