十分钟学会C++|十分钟学会C++ Traits
最近和一个朋友闲聊的时候他对我说一个人对C++的理解很多种境界,朋友不是个喜欢吹牛的人,于是听他细说,觉得很是有道理。
想写一篇C++ traits方面的文章已经有一段时间了,但是说实话traits这项技术确实有些晦涩,很担心写完了达不到期望的效果,于是每每试图以简炼的文字表达,慢慢的就等到了今天。
先说说我为什么专门对这项技术写一篇文章吧。记得当时在看STL/boost代码的时候经常遇到traits,当时惊叹于代码原来可以这样写,但是最初根本是看不懂的,查了一些资料才彻底理解了traits存在的意义。
本质定义:加上一层间接性,换来以定的灵活性。
看下面的代码:
templatestruct is_void{ static const bool value = https://www.it610.com/article/false; }; template <> struct is_void { static const bool value = https://www.it610.com/article/true; };
我们可以这样使用这份代码:
Is_void
Is_void
完整测试代码如下:
templatestruct is_void{ static const bool value = https://www.it610.com/article/false; }; template <> struct is_void { static const bool value = https://www.it610.com/article/true; }; int _tmain(int argc, _TCHAR* argv[]){std::cout< ::value; std::cout< ::value; return 0; }
下面我们来看一个复杂点的例子,考验一下你的理解:
namespace detail{templatestruct copier{template static I2 do_copy(I1 first, I1 last, I2 out); }; template template I2 copier::do_copy(I1 first, I1 last, I2 out){while(first != last){*out = *first; ++out; ++first; }return out; }template <>struct copier {template static I2* do_copy(I1* first, I1* last, I2* out){memcpy(out, first, (last-first)*sizeof(I2)); return out+(last-first); }}; }template inline I2 copy(I1 first, I1 last, I2 out){typedef typename boost::remove_cv ::value_type>::type v1_t; typedef typename boost::remove_cv ::value_type>::type v2_t; enum{ can_opt = boost::is_same ::value&& boost::is_pointer ::value&& boost::is_pointer ::value&& boost::has_trivial_assign ::value }; return detail::copier ::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++|十分钟学会C++ Traits】到此这篇关于十分钟学会C++ Traits的文章就介绍到这了,更多相关C++ Traits内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- vscode|windows操作系统下用vscode写C++
- python|我,27岁按摩师,摘掉口罩后的新收获(在家一个月学会Python,薪资直接破万)
- 第8篇:C++哈希表-冲突解决方案
- PS抠图技巧|PS抠图技巧 | 一次性学会颜色范围快速抠图
- 餐饮门店销售小技巧揭秘,学会这招直接把竞品干趴下!
- 俊豪快写
- 悦读园公益读书会——《卡夫卡变虫记》学会关爱他人
- 新爸五年计划|新爸五年计划 | 121 女儿学会骑自行车了
- 总得学会自己一个人吧
- c++笔记