c++ template traits
来源:互联网 发布:python可以做界面吗 编辑:程序博客网 时间:2024/06/14 20:09
看了好久的c++ templates,是时候总结一下了, 从traits 开始讲起, 往后会把所学到的东西一一写上。
首先我们从一个实例开始,对一个数组进行一个累加操作。可如此做。
考虑一些比较特殊的情况,比如说一个char的数组,要对其求和。如果其值超过了255就会溢出,那么显示的值就不正确。譬如:如此调用这个模板
int main(){ char num[3] = {'a','z','f'}; std::cout << accum(&num[0], &num[3]) << std::endl; return 0;}
打印出来的值是65,很明显结果错误。这时候,c++ templates 上所说是可以使用accum<int>(&num[0],&num[3])
, 在linux上试了下,char * 强转为int * 是不合法的。所以必须要引入traits.
如图, 通过traits技法,引入了模板参数的一些额外的自然属性。这里的typename不可省略,因为编译器无法知道这个Accum是型别,是成员变量还是一个成员函数。其中c++ templeates 在第九章也提到
通常而言,依赖型受限名称并不会代表一个类型,除非在该名称前面有关键字typename前缀。
何为依赖型,一个依赖于模板参数的名称,何为受限型,基于受限查找的,如S::x, this->f, p->A::m
。上图的Accum 很明显属于依赖受限型名称。
上图针对溢出的特化还不够完整,不过基本思想已经能够体现出来了。另一个要注意的地方 AccT(),不一定返回0。所以我们可以继续使用traits.
template<>class AccumulationTraits<char> { public: typedef int Accum; static AccT zero(){return 0;}};
对于traits,我们可以提供一个缺省实参可以让用户进行一些改写。c++11以前函数模板是不能提供缺省实参的,只有类模板可以实现这个功能,下图给出一个c++11函数模板提供缺省实参的例子。
如上图,AT为缺省模板实参,这个可以被用户自己所写的traits所替换。
最后我们来看一下traits技法的具体应用。
比如我们可以实现一个自己的count
如图,对于标准的count是需要支持原生指针的,所以利用traits技法多了层间接性,从而对 原始指针类型做了一个偏特化。
初步总结了trait技法的一些,以后碰到了争取能够做点扩展和提炼。
- c++ template traits
- [c++]traits
- c++ template 的traits技术
- Traits: a new and useful template technique
- C++ template 的 type traits 代码
- C++template
- C template
- C++Template
- C++—Traits编程技法
- C++traits技术的理解
- traits
- traits
- traits
- Traits
- Traits
- C++——Traits编程技法
- 【C++】traits技术与模板元编程
- 《Effective C++》再次探索traits技法
- hdu 1269 迷宫城堡
- 2017.8.10 Oricle Linux系统和数据库安装时遇到的问题
- All boot options are tried.
- kattle使用手册翻译
- 子序列翻转
- c++ template traits
- c++ primer第三章笔记
- kmp 之 next数组
- 软件测试人员的脑子里到底在想什么?
- HDU 6103 Kirinriki
- 开博
- Oracle 常用环境变量查询
- MONKOVEL-安卓端免费的小说阅读器 源码分享
- 【STL】list的简单剖析以及各种函数的实现