十分钟让你对C++ Traits大彻大悟
最近和一个朋友闲聊的时候他对我说一个人对C++的理解很多种境界,朋友不是个喜欢吹牛的人,于是听他细说,觉得很是有道理。
想写一篇C++ traits方面的文章已经有一段时间了,但是说实话traits这项技术确实有些晦涩,很担心写完了达不到期望的效果,于是每每试图以简炼的文字表达,慢慢的就等到了今天。
先说说我为什么专门对这项技术写一篇文章吧。记得当时在看STL/boost代码的时候经常遇到traits,当时惊叹于代码原来可以这样写,但是最初根本是看不懂的,查了一些资料才彻底理解了traits存在的意义。
本质定义:加上一层间接性,换来以定的灵活性。
看下面的代码:
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在编译期。
完整测试代码如下:
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;
}
下面我们来看一个复杂点的例子,考验一下你的理解:
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大彻大悟相关推荐
- 十分钟成为 Contributor 系列 | 为 TiDB 重构 built-in 函数
2019独角兽企业重金招聘Python工程师标准>>> 这是十分钟成为 TiDB Contributor 系列的第二篇文章,让大家可以无门槛参与大型开源项目,感谢社区为 TiDB 带 ...
- 用D3.js 十分钟实现字符跳动效果
用D3.js 十分钟实现字符跳动效果 注 本文基于 D3.js 作者 Mike Bostock 的 例子 原文分为三部分, 在这里笔者将其整合为了一篇方便阅读. 该效果基于 D3.js, 主要使用到了 ...
- 飞机的“黑色十分钟”能被人工智能消灭吗?
[导读]近年来,"AI的应用和落地"逐渐成了具化的关键词,它和很多事物很多行业结合在一起,形成了奇妙的"化学反应".例如,在日常生活中,AI可以推送我们喜欢的新 ...
- 十分钟上手2022latex安装与入门
序言:本次下载是为美赛而用,因此我们选择的下载组合为texlive+texstudio,使用windows10安装.在此提醒大家,类似工具的下载建议大家亲历亲为,不要相信一些诱导性网站,都是非官方的安 ...
- 十分钟用Windows服务器简单搭建DHCP中继代理!!
十分钟用Windows服务器简单搭建DHCP中继代理!! 一.什么是中继代理? 大家都知道DHCP分配地址都需要用到IP广播,但是广播是不能在两个网段之间进行 ...
- 《科学》:媲美AlphaFold2的蛋白质结构预测新工具问世,一台游戏计算机十分钟出结果,完全免费...
来源:学术头条本文约2000字,建议阅读5分钟 整个研究学界都将受益. 如今,人工智能已经渗透到人们生活的方方面面,各种深度学习算法也越来越多地应用于各个领域.尤其在生物和医学领域,人工智能技术可以说 ...
- 十分钟了解分布式计算:GraphX
GraphX原型论文 GraphX是Spark中用于图(e.g., Web-Graphs and Social Networks)和图并行计算(e.g., PageRank and Collabora ...
- 10.11杭州Clouder lab 十分钟搭建共享应用 2:如何通过日志服务实现用户的日志收集与分析...
场景描述 共享电动车企业使用函数服务搭建服务端.在函数服务中开启日志,把程序日志写到日志服务,同时在函数代码中使用SDK把运营日志写入到日志服务,使用日志服务进行日志分析. 在日志服务中,用户可以: ...
- python新手教程 从零开始-Python零基础从零开始学习Python十分钟快速入门
原标题:Python零基础从零开始学习Python十分钟快速入门 学习Python的,都知道Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python是一种动态解释型的 ...
- access 提供程序无法确定object 值_Python | 加一行注释,让你的程序提速10+倍!numba库十分钟上手指南...
如果你在使用Python进行高性能计算,Numba提供的加速效果可以比肩原生的C/C++程序,只需要在函数上添加一行@jit的装饰.它支持CPU和GPU,是数据科学家必不可少的编程利器. 之前的文章 ...
最新文章
- 初中数学老师计算机培训反思,初中数学教师培训心得体会
- JMJS系统总结系列----Jquery分页扩展库(五)
- C语言的设计模式-接口隔离
- asp 转换html代码,asp下实现对HTML代码进行转换的函数
- JDBC 创建连接对象的三种方式 、 properties文件的建立、编辑和信息获取
- Nginx教程-location配置
- linux-时间日期类
- 天源迪科和科大讯飞的关系_科大讯飞 语音突围
- 前端招聘与前端卖身的困境
- ThinkPHP 数据库操作(七) : 视图查询、子查询、原生查询
- 如何建立自己的知识体系?(摘)
- java移动接口发短信_天天都会写接口,但它的用途和好处有多少人能说得清楚?...
- 鼠标偏移量_不止颜值!活动鼠标使用评测
- iOS实现音频和视频播放-运用AVPlayer
- STM32F103ZET6+ADF4351+HMI串口屏
- 【Python百日进阶-Web开发-Feffery】Day418 - fac实例:dash+fac登录-Sqlite数据库
- 经常被问到的有深度有内涵的数据结构面试题
- 附加题——求n的阶乘和
- 自定义时间(小时:分钟)选择器
- PostgreSQL pgsql身份证格式校验,身份证格式提取api