我的编程空间,编程开发者的网络收藏夹
学习永远不晚

十分钟学会C++ Traits

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

十分钟学会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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

十分钟学会C++ Traits

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

下载Word文档

猜你喜欢

分分钟钟学会Python - 基础

1、常见操作系统1、windowsxp/win7/win/10/window server2、linuxcentos,图形化界面差ubuntu,个人开发(图形化比较好)redhat,企业级3、mac2、编码1、初识编码ascii,英文,8位
2023-01-31

分分钟钟学会Python - 解释器安装

1. 下载解释器python 2.7.16 (2020年官方不在维护)python 3.6.8 (推荐)2、安装 python 3.6.8安装位置随意,自己能找到了就行。安装第一页的所有√都要打上。3、检查python 3.6.8是否安装成
2023-01-31

三分钟学会Linux基本指令

目录一、linux是什么1.1Linux :1.2Linux理解:二、Linux操作系统的常见指令2.1、mkdir指令:2.2、touch指令:2.3、ls指令: 2.4、 pwd指令: 2.5、cd指令: 2.6 rm &&rmdir2
2022-12-05

五分钟学会Elasticsearch查询代理设计

Elasticsearch(ES)是一款基于Lucene的开源分布式搜索引擎。由于其稳定、可靠、快速、安装使用方便等优良特性,目前在业界已广泛使用。ES用途主要分两个方向:分布式实时文件存储 以及 分布式实时分析搜索引擎。一、为什么需要查询
2023-06-05

六分钟带你快速学会react中的useMemo

简单说React.memo()是通过校验props中的数据是否改变的来决定组件是否需要重新渲染的一种缓存技术,下面这篇文章主要给大家介绍了关于如何快速学会react中useMemo的相关资料,需要的朋友可以参考下
2022-12-23

3分钟学会如何上手supervisor看门狗

软硬件环境centos7.6.1810 64bitcat /etc/redhat-release #查看系统版本supervisor 3.4.0python 2.7.5supervisor简
2022-06-04

学会Python+Selenium,分分钟搭建Web自动化框架!

用python+selenium实现UI自动化测试,要有一些HTML和xpth的基础,当然python基础一定是必须要会的。笔者建议花点时间了解下相关基础知识,不至于后面发懵。一、什么是selenium?selenium是个强大的工具集。支
2023-06-05

Redis数据类型简介(十分钟快速学习Redis)

如何在ubuntu18.04上安装和保护redis如何连接到Redis数据库如何管理Redis数据库和Keys如何在Redis中管理副本和客户端如何在Redis中管理字符串如何在Redis中管理list如何在Redis中管理Hashes如何在Redis中管理S
Redis数据类型简介(十分钟快速学习Redis)
2018-09-27

TOP命令参数详解---10分钟学会top用法

TOP命令详解 一、top命令介绍   相信每个运维人员都遇到过的事情就是服务器的负载突然飙升,碰到这种情况,大家第一反应一定是登到服务器上,先敲一个top命令看看load average吧。在Linux操作系统中,top是使用最频繁,也是
2023-08-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录