最近和一个朋友闲聊的时候他对我说一个人对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

转载于:https://www.cnblogs.com/pugang/archive/2012/10/17/2727378.html

十分钟让你对C++ Traits大彻大悟相关推荐

  1. 十分钟成为 Contributor 系列 | 为 TiDB 重构 built-in 函数

    2019独角兽企业重金招聘Python工程师标准>>> 这是十分钟成为 TiDB Contributor 系列的第二篇文章,让大家可以无门槛参与大型开源项目,感谢社区为 TiDB 带 ...

  2. 用D3.js 十分钟实现字符跳动效果

    用D3.js 十分钟实现字符跳动效果 注 本文基于 D3.js 作者 Mike Bostock 的 例子 原文分为三部分, 在这里笔者将其整合为了一篇方便阅读. 该效果基于 D3.js, 主要使用到了 ...

  3. 飞机的“黑色十分钟”能被人工智能消灭吗?

    [导读]近年来,"AI的应用和落地"逐渐成了具化的关键词,它和很多事物很多行业结合在一起,形成了奇妙的"化学反应".例如,在日常生活中,AI可以推送我们喜欢的新 ...

  4. 十分钟上手2022latex安装与入门

    序言:本次下载是为美赛而用,因此我们选择的下载组合为texlive+texstudio,使用windows10安装.在此提醒大家,类似工具的下载建议大家亲历亲为,不要相信一些诱导性网站,都是非官方的安 ...

  5. 十分钟用Windows服务器简单搭建DHCP中继代理!!

                         十分钟用Windows服务器简单搭建DHCP中继代理!! 一.什么是中继代理? 大家都知道DHCP分配地址都需要用到IP广播,但是广播是不能在两个网段之间进行 ...

  6. 《科学》:媲美AlphaFold2的蛋白质结构预测新工具问世,一台游戏计算机十分钟出结果,完全免费...

    来源:学术头条本文约2000字,建议阅读5分钟 整个研究学界都将受益. 如今,人工智能已经渗透到人们生活的方方面面,各种深度学习算法也越来越多地应用于各个领域.尤其在生物和医学领域,人工智能技术可以说 ...

  7. 十分钟了解分布式计算:GraphX

    GraphX原型论文 GraphX是Spark中用于图(e.g., Web-Graphs and Social Networks)和图并行计算(e.g., PageRank and Collabora ...

  8. 10.11杭州Clouder lab 十分钟搭建共享应用 2:如何通过日志服务实现用户的日志收集与分析...

    场景描述 共享电动车企业使用函数服务搭建服务端.在函数服务中开启日志,把程序日志写到日志服务,同时在函数代码中使用SDK把运营日志写入到日志服务,使用日志服务进行日志分析. 在日志服务中,用户可以: ...

  9. python新手教程 从零开始-Python零基础从零开始学习Python十分钟快速入门

    原标题:Python零基础从零开始学习Python十分钟快速入门 学习Python的,都知道Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python是一种动态解释型的 ...

  10. access 提供程序无法确定object 值_Python | 加一行注释,让你的程序提速10+倍!numba库十分钟上手指南...

    如果你在使用Python进行高性能计算,Numba提供的加速效果可以比肩原生的C/C++程序,只需要在函数上添加一行@jit的装饰.它支持CPU和GPU,是数据科学家必不可少的编程利器. 之前的文章 ...

最新文章

  1. 初中数学老师计算机培训反思,初中数学教师培训心得体会
  2. JMJS系统总结系列----Jquery分页扩展库(五)
  3. C语言的设计模式-接口隔离
  4. asp 转换html代码,asp下实现对HTML代码进行转换的函数
  5. JDBC 创建连接对象的三种方式 、 properties文件的建立、编辑和信息获取
  6. Nginx教程-location配置
  7. linux-时间日期类
  8. 天源迪科和科大讯飞的关系_科大讯飞 语音突围
  9. 前端招聘与前端卖身的困境
  10. ThinkPHP 数据库操作(七) : 视图查询、子查询、原生查询
  11. 如何建立自己的知识体系?(摘)
  12. java移动接口发短信_天天都会写接口,但它的用途和好处有多少人能说得清楚?...
  13. 鼠标偏移量_不止颜值!活动鼠标使用评测
  14. iOS实现音频和视频播放-运用AVPlayer
  15. STM32F103ZET6+ADF4351+HMI串口屏
  16. 【Python百日进阶-Web开发-Feffery】Day418 - fac实例:dash+fac登录-Sqlite数据库
  17. 经常被问到的有深度有内涵的数据结构面试题
  18. 附加题——求n的阶乘和
  19. 自定义时间(小时:分钟)选择器
  20. PostgreSQL pgsql身份证格式校验,身份证格式提取api

热门文章

  1. 美景听听Ai语音导游,助力华为荣耀PLAY手机发布
  2. P1969 积木大赛
  3. 记录一次常见的错误:java.sql.SQLException: Got error 28 from storage engine
  4. 六分钟八法则塑造优秀程序员
  5. Struts2中的校验器
  6. 【转】请不要做浮躁的人。
  7. ACCP学习旅程之----- 使用Dreamweaver制作网页
  8. wcf中的几个配置问题
  9. Java 网络文件传输
  10. GBDT 特征提取(2)