Boost中应用的泛型编程技术
raits<T>看起来是这个样 子:
该traits的value_type可以让泛型代码得知该迭代器所“指向”的是 何种类型的数据;而iterator_category对迭代器的能力进行分类,针对不同类型 的迭代器我们选择与之适应的最高效的算法。 traits模板有一个很重要的 特点:它们是非侵入的(non-intrusive)。我们可以为任何类型提供相关信息, 不管它是内建的类型,还是第三方的库中提供的类型。为了给某一特定类型指定 traits,一般采用部分特化或者全特化traits模板的方式。 欲更深入的了 解std::iterator_traits,可以参阅SGI提供的资料。 std::numeric_limits<T>也采用了traits技术,提供表示各内建数值类型 取值范围的常量值。 4、标记分派 另外有一种技术经常与traits合用, 那就是标记分派。它依据类型的属性,通过函数重载进行分派。一个很好的例子 就是std::advance()函数。这个函数的功能是将一个迭代器递增n次,对于不同类 型的迭代器可以有各自优化的实现方法。如果是随机访问迭代器(可以以任意的 距离前后跳转),advance()函数可以用i+=n来实现,既简单又高效,只需要常量 时间。而其它的迭代器必须一步一步地递增,需要线性的时间复杂度。如果是双 向迭代器,n就可能为负值,因此必须判断对迭代器到底是增还是减。 标 记分派和traits类的联系很紧密。分派所依据的属性(在这个例子中是 iterator_category)一般都是通过traits类来取得。主advance()函数从 iterator_traits中获得对应于该iterator的iterator_category,然后调用重载 过的advance_dispach()函数。编译器依据作为参数传给advance_dispach()的 iterator_category,选择合适的重载版本。标记只是一个极其简单的类,它的唯 一任务就是为标记分派或者其它类似技术传递必要的信息。
5、适配器 适配器是一种类模板,建立在其它类型之上,提供新的 接口或者行为。标准库中就使用了适配器,比如std::reverse_iterator通过反转 迭代器的递增/递减行为,适配了迭代器,还有std::stack,通过适配标准容器, 提供一个简单的堆栈接口。 在这里可以找到标准库中所用适配器的深入阐 述。 6、类型生成器 类型生成器的工作是依据它的模板参数合成新 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |