iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >十分钟学会C++ Traits
  • 805
分享到

十分钟学会C++ Traits

2024-04-02 19:04:59 805人浏览 八月长安
摘要

最近和一个朋友闲聊的时候他对我说一个人对c++的理解很多种境界,朋友不是个喜欢吹牛的人,于是听他细说,觉得很是有道理。 想写一篇C++ traits方面的文章已经有一段时间了,但是说

最近和一个朋友闲聊的时候他对我说一个人对c++的理解很多种境界,朋友不是个喜欢吹牛的人,于是听他细说,觉得很是有道理。

想写一篇C++ traits方面的文章已经有一段时间了,但是说实话traits这项技术确实有些晦涩,很担心写完了达不到期望的效果,于是每每试图以简炼的文字表达,慢慢的就等到了今天。

先说说我为什么专门对这项技术写一篇文章吧。记得当时在看STL/boost代码的时候经常遇到traits,当时惊叹于代码原来可以这样写,但是最初根本是看不懂的,查了一些资料才彻底理解了traits存在的意义。

本质定义:加上一层间接性,换来以定的灵活性。

看下面的代码:

template <typename T> 
struct is_void
{ static const bool value = false; };
template <> 
struct is_void<void>
{ static const bool value = true; };

我们可以这样使用这份代码:

Is_void<false>::value 调用第一份代码,也就是说只要我们传入一个参数像下面这样:

Is_void<T>::value,其中T可以为任意类型,我们就可以判断这个类型是不是void在编译期。

完整测试代码如下:

template <typename T> 
struct is_void
{ 
    static const bool value = false; 
};

template <> 
struct is_void<void>
{ 
    static const bool value = true; 
};

int _tmain(int arGC, _TCHAR* argv[])
{
    std::cout<<is_void<int>::value;
    
    std::cout<<is_void<void>::value;
    return 0;
}

下面我们来看一个复杂点的例子,考验一下你的理解:

namespace detail{
    template <bool b>
    struct copier
    {
       template<typename I1, typename I2>
       static I2 do_copy(I1 first, I1 last, I2 out);
    };

    template <bool b>
    template<typename I1, typename I2>
    I2 copier<b>::do_copy(I1 first, I1 last, I2 out)
    {
       while(first != last)
       {
          *out = *first;
          ++out;
          ++first;
       }
       return out;
    }
    template <>
    struct copier<true>
    {
       template<typename I1, typename I2>
       static I2* do_copy(I1* first, I1* last, I2* out)
       {
          memcpy(out, first, (last-first)*sizeof(I2));
          return out+(last-first);
       }
    };
    }

    template<typename I1, typename I2>
    inline I2 copy(I1 first, I1 last, I2 out)
    {
       typedef typename 
        boost::remove_cv<
         typename std::iterator_traits<I1>
          ::value_type>::type v1_t;
       typedef typename 
        boost::remove_cv<
         typename std::iterator_traits<I2>
          ::value_type>::type v2_t;
       enum{ can_opt = 
          boost::is_same<v1_t, v2_t>::value
          && boost::is_pointer<I1>::value
          && boost::is_pointer<I2>::value
          && boost::
          has_trivial_assign<v1_t>::value 
       };
       return detail::copier<can_opt>::
          do_copy(first, last, out);
}

总结

本文试图以最简洁的方式阐述对C++ traits 的理解,当你理解了第二个例子的时候,相信你已经理解了C++ traits,恭喜你对C++ 的理解上了一个层次。

Bibliography:

Http://www.boost.org/doc/libs/1_31_0/libs/type_traits/c++_type_traits.htm

到此这篇关于十分钟学会C++ Traits的文章就介绍到这了,更多相关C++ Traits内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 十分钟学会C++ Traits

本文链接: https://www.lsjlt.com/news/138692.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 十分钟学会C++ Traits
    最近和一个朋友闲聊的时候他对我说一个人对C++的理解很多种境界,朋友不是个喜欢吹牛的人,于是听他细说,觉得很是有道理。 想写一篇C++ traits方面的文章已经有一段时间了,但是说...
    99+
    2022-11-13
  • 分分钟钟学会Python - 基础
    1、常见操作系统 1、windows xp/win7/win/10/window server 2、linux centos,图形化界面差 ubuntu,个人开发(图形化比较好) redhat,企业级 3、mac 2、编码 1、初...
    99+
    2023-01-31
    基础 Python
  • 十分钟教你学会JAVA中的学生管理系统
      目录 创建学生类 测试类中主界面的代码编写 添加学生信息的代码编写(addStuent) 删除学生信息的代码编写(deleteStudent) 修改学生信息的代码编写(updateStudent) 查看学生信息的代码...
    99+
    2023-08-31
    java 数据库 开发语言
  • 分分钟钟学会Python - 解释器安装
    1. 下载解释器 python 2.7.16 (2020年官方不在维护) python 3.6.8 (推荐) 2、安装 python 3.6.8 安装位置随意,自己能找到了就行。 安装第一页的所有√都要打上。 3、检查pyth...
    99+
    2023-01-31
    Python
  • 全网最全ssh:远程连接服务器学习,教你十分钟学会
     远程连接服务器简介 SSH是如何工作的? 认证阶段 ssh修改配置文件 配置文件注释  练习 试验1 实验2 测试  远程连接服务器简介 什么是远程连接服务器 远程连接服务器通过文字或图形接口方式来远程登录系统,让你在远程终端前登录...
    99+
    2023-10-21
    服务器 ssh 学习
  • 十分钟教会你用Python处理CSV文件
    目录前言Python库:csv读取csv文件使用csv.reader读取数据使用csv.DictReader读取数据写入csv文件使用csv.writer写入数据使用csv.Dict...
    99+
    2022-11-11
  • 三分钟学会Linux基本指令
    目录一、linux是什么1.1Linux :1.2Linux理解:二、Linux操作系统的常见指令2.1、mkdir指令:2.2、touch指令:2.3、ls指令: 2.4、 pwd指令: 2.5、c...
    99+
    2022-12-05
    Linux基本指令 Linux指令
  • 30分钟学会如何使用Shiro
    摘要: Shiro的核心部分是SecurityManager,它负责安全认证与授权。Shiro本身已经实现了所有的细节,用户可以完全把它当做一个黑盒来使用。SecurityUtils对象,本质上就是一个工厂...
    99+
    2022-10-18
  • 让你分分钟学会python条件语句
    Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。 我们通过下图来简单了解下条件语句的执行过程: Python程序语言指定任何非0和非...
    99+
    2022-11-12
  • 十分钟在 macOS 快速搭建 Linux C/C++ 开发环境
    有一个使用了 Epoll 的 C 项目,笔者平时用的 Linux 主力开发机不在身边,想在 macOS 上开发调试,但是没有 Linux 虚拟机。恰好,JetBrains CLion 的 Toolch...
    99+
    2023-08-31
    linux macos c语言 c++ docker
  • 五分钟学会Python 模块和包、文件
    目录一、 模块1、模块的概念2、模块的两种导入方式3、模块的搜索顺序[扩展]4、 name 属性二、包1、概念三、发布模块(知道)1、 制作发布压缩包步骤2、安装模块3、pip 安装...
    99+
    2022-11-12
  • 五分钟学会Elasticsearch查询代理设计
    Elasticsearch(ES)是一款基于Lucene的开源分布式搜索引擎。由于其稳定、可靠、快速、安装使用方便等优良特性,目前在业界已广泛使用。ES用途主要分两个方向:分布式实时文件存储 以及 分布式实时分析搜索引擎...
    99+
    2023-06-05
  • Redis数据类型简介(十分钟快速学习Redis)
    如何在ubuntu18.04上安装和保护redis 如何连接到Redis数据库 如何管理Redis数据库和Keys 如何在Redis中管理副本和客户端 如何在Redis中管理字符串 如何在Redis中管理list 如何在Redi...
    99+
    2018-09-27
    Redis数据类型简介(十分钟快速学习Redis)
  • 3分钟学会如何上手supervisor看门狗
    软硬件环境 centos7.6.1810 64bit cat /etc/redhat-release #查看系统版本 supervisor 3.4.0 python 2.7.5 supervis...
    99+
    2022-06-04
    supervisor看门狗 python supervisor
  • 10分钟学会VS NuGet包私有化部署
    目录前言什么是BaGet搭建私有化BaGet服务器使用私有化程序包前言 我们之前实现了打包发布NuGet,但是发布后的引用是公有的,谁都可以访问,显然这种方式是不可取的。 命令版本:...
    99+
    2022-11-12
  • 六分钟带你快速学会react中的useMemo
    目录概念useMemo栗子筛选偶数每秒获取时间刷新页面如何优化useCallback、React.memo总结概念 react 中是通过一次次的 re-render (重新渲染)保持...
    99+
    2022-12-23
    react usememo react usememo原理
  • 学会Python+Selenium,分分钟搭建Web自动化框架!
    用python+selenium实现UI自动化测试,要有一些HTML和xpth的基础,当然python基础一定是必须要会的。笔者建议花点时间了解下相关基础知识,不至于后面发懵。一、什么是selenium?selenium是个强大的工具集。支...
    99+
    2023-06-05
  • 使用cpolar内网穿透实现公网远程访问,十分钟就可以学会使用
    内网穿透,可以有多种方式实现: 自己有公网IP,进入路由器做映射 自己有公网服务器搭建内网穿透 通过第三方公网服务器进行流量转发,映射本地端口 比较常见是第三种方式,不需要自己搭建服务,也不用去申请公网IP、不用设置路由器,不论是本地开发...
    99+
    2023-09-02
    服务器 网络 运维
  • 五分钟菜鸟学会Python玩转SQL的神器!
    背景其实一开始用的是pymysql,但是发现维护比较麻烦,还存在代码注入的风险,所以就干脆直接用ORM框架。ORM即Object Relational Mapper,可以简单理解为数据库表和Python类之间的映射,通过操作Python类,...
    99+
    2023-05-14
    Python SQL
  • 1分钟教你学会,反向代理OpenAI服务器!
    在 Node.js 中,您可以使用 http-proxy-middleware 这个库来轻松地搭建一个反向代理服务器。 以下是一个简单的示例: 首先,确保您已经安装了 Node.js。 在项目目录中运行以下命令来初始化一个新的 Node.j...
    99+
    2023-09-05
    服务器 前端 javascript
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作