c++ template traits

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/alittlebird0/article/details/77075469

看了好久的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的第一个版本
如图, 通过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技法的一些,以后碰到了争取能够做点扩展和提炼。

猜你喜欢

转载自blog.csdn.net/alittlebird0/article/details/77075469