博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
trait与policy模板应用简单示例
阅读量:6237 次
发布时间:2019-06-22

本文共 6504 字,大约阅读时间需要 21 分钟。

trait与policy模板应用简单示例

 

accumtraits.hpp // 累加算法模板的trait

// 累加算法模板的trait#ifndef ACCUMTRAITS_HPP#define ACCUMTRAITS_HPPtemplate 
class AccumulationTraits; // 只有声明 template <>class AccumulationTraits
// 把具体类型char映射到int,累加后就返回int {public: typedef int AccT; // 统一的类型别名,表示返回类型 static AccT zero() // 关联一个缺省值,是累加时的初始缺省值 { return 0; }};template <>class AccumulationTraits
// 把具体类型short映射到累加后的返回类型int {public: typedef int AccT; static AccT zero() // 没有直接在类内部定义static变量并提供缺省值,而是使用了函数 { // 因为类内部只能对整型和枚举类型的static变量进行初始化 // 其他类型的必须类内部声明,在外部进行初始化 return 0; }};template <>class AccumulationTraits
{public: typedef long AccT; static AccT zero() { return 0; }};template <>class AccumulationTraits
{public: typedef unsigned long AccT; static AccT zero() { return 0; }};template <>class AccumulationTraits
{public: typedef double AccT; static AccT zero() { return 0; }};#endif // !ACCUMTRAITS_HPP

 

policies.hpp // 累加算法模板的policy

// 累加算法模板的policy#ifndef POLICIES_HPP#define POLICIES_HPPtemplate 
class SumPolicy // 累加的策略{public: static void accumulate(T1 & total, T2 const & value) { total += value; // 累加 }};template
class MultPolicy // 累乘的策略{public: static void accumulate(T1 & total, T2 const & value) { total *= value; // 累乘 }};#endif // !POLICIES_HPP

 

 

accum.hpp // 累加算法模板:实现为类模板,用模板参数来传递policy和trait

// 累加算法模板:实现为类模板,用模板参数来传递policy和trait // 可用一个内联函数模板作为包装器来包装这个类模板实现 #ifndef ACCUM_HPP#define ACCUM_HPP#include "accumtraits.hpp"#include "policies.hpp"#include 
template < typename T, // 这里使用 typename 和 class 没有区别 const int INITVAL = 0, // INITVAL 是一个 无类型模板参数 template
class Policy = SumPolicy, // 这里的必须使用class不能是typename, 因为 Policy 是类类型, 默认采用SumPolicy策略 typename Traits = AccumulationTraits
> // 模板参数Traits代表要使用的traitclass Accum{public: // AccumulationTraits 是一个 standard traits class (标准特性类) // AccT 嵌套在 AccumulationTraits
内部类型, 而且 T 是一个模版参数 // AccT 是一个 nested dependent type name (嵌套依赖类型名), 必须被 typename 前置 static typename Traits::AccT accum(T const * beg, T const * end) { // total 是一个与 AccT 类型所指向的类型相同的局部变量 // zero() 嵌套在 AccumulationTraits
内部函数, 而且 T 是一个模版参数 //typename Traits::AccT total = Traits::zero(); // 获取缺省值, 返回 0 // 存在问题: 当策略为 MultPolicy 会造成结果始终为 0 typename Traits::AccT total = INITVAL; // 把初始值当作【无类型模板参数】传递进来 while (beg != end) // 作累积运算 { Policy
::accumulate(total, *beg); // 使用给定的算法策略来进行累积 ++beg; } return total; // 返回累积起来的值 }};//// 用内联的函数模板来包装, 对默认的参数,提供对应的重载函数template
class Policy, typename Traits>inline typename Traits::AccT accum(T const * beg, T const * end){ std::cout << "
class Policy, typename Traits> \n\t--->
" << std::endl; // 标记使用 return Accum
::accum(beg, end);}template
class Policy>inline typename AccumulationTraits
::AccT accum(T const * beg, T const * end){ std::cout << "
class Policy> \n\t--->
>" << std::endl; // 标记使用 return Accum
>::accum(beg, end);}template
inline typename AccumulationTraits
::AccT accum(T const * beg, T const * end){ std::cout << "
\n\t--->
>" << std::endl; // 标记使用 return Accum
>::accum(beg, end);}template
inline typename AccumulationTraits
::AccT accum(T const * beg, T const * end){ std::cout << "
\n\t--->
>" << std::endl; // 标记使用 return Accum
>::accum(beg, end);}template <>inline typename AccumulationTraits
::AccT accum(int const * beg, int const * end){ std::cout << "<> \n\t--->
>" << std::endl; // 标记使用 return Accum
>::accum(beg, end);}#endif // !ACCUM_HPP

 

mytest.cpp // 使用累加算法的客户端测试代码  

// 使用累加算法的客户端测试代码  #include "accum.hpp"#include 
int main(){ int num[] = {
1,2,3,4,5}; // 整型数组 std::cout << "============= integer array =============" << std::endl; std::cout << "the total value of the integer values is " << accum
>(&num[0], &num[5]) << std::endl; std::cout << "the total value of the integer values is " << accum
(&num[0], &num[5]) << std::endl; std::cout << "the total value of the integer values is " << accum
(&num[0], &num[5]) << std::endl; std::cout << "the total value of the integer values is " << accum
(&num[0], &num[5]) << std::endl; std::cout << "the total value of the integer values is " << accum<>(&num[0], &num[5]) << std::endl; std::cout << "the total value of the integer values is " << accum(&num[0], &num[5]) << std::endl; char name[] = "templates"; // 创建字符值数组 int length = sizeof(name)-1; std::cout << "============= characters array =============" << std::endl; std::cout << "the total value of the characters in \"" << name << "\" is " << accum
>(&name[0], &name[length]) << std::endl; std::cout << "the total value of the characters in \"" << name << "\" is " << accum
(&name[0], &name[length]) << std::endl; std::cout << "the total value of the characters in \"" << name << "\" is " << accum
(&name[0], &name[length]) << std::endl; std::cout << "the total value of the characters in \"" << name << "\" is " << accum
(&name[0], &name[length]) << std::endl; std::cout << "the total value of the characters in \"" << name << "\" is " << accum<>(&name[0], &name[length]) << std::endl; std::cout << "the total value of the characters in \"" << name << "\" is " << accum(&name[0], &name[length]) << std::endl; system("pause"); return 0;}

 

 

输出结果:

============= integer array =============
class Policy, typename Traits> --->
the total value of the integer values is 120
class Policy> --->
>the total value of the integer values is 120
--->
>the total value of the integer values is 120<> --->
>the total value of the integer values is 120<> --->
>the total value of the integer values is 120<> --->
>the total value of the integer values is 120============= characters array =============
class Policy, typename Traits> --->
the total value of the characters in "templates" is 975
class Policy> --->
>the total value of the characters in "templates" is 975
--->
>the total value of the characters in "templates" is 0
--->
>the total value of the characters in "templates" is 465857536
--->
>the total value of the characters in "templates" is 465857536
--->
>the total value of the characters in "templates" is 465857536请按任意键继续. . .

 

转载地址:http://nczia.baihongyu.com/

你可能感兴趣的文章
04.JavaIO流问题
查看>>
CORS 理解(不要那么多术语)
查看>>
[LeetCode] 767. Reorganize String
查看>>
JS面向对象的程序设计之继承的实现-寄生组合式继承
查看>>
前端--iframe爬坑记录
查看>>
【实践】视频播放成功率下降很多?可能是你密钥管理的方式不对!
查看>>
设计类六大原则
查看>>
Python: kafka-python版本差异导致的问题
查看>>
通过NPD在kubernetes集群上增强节点的错误检测能力
查看>>
Drools 文档(KIE概述)
查看>>
Python进程专题2:multiprocessing创建进程
查看>>
聊聊rocketmq的NettyEncoder及NettyDecoder
查看>>
从0开始用python写一个命令行小游戏(三)
查看>>
ubuntu-desktop安装
查看>>
学会这15点,让你分分钟拿下 Redis 数据库
查看>>
再读Generator和Co源码
查看>>
「案例」让房东在 Airbnb 上展示他们的热情好客
查看>>
vue-cli的项目结构
查看>>
利用 WeakMap 对 Vue 新建数组中的对象赋予 :key
查看>>
CSS3中display属性的Flex布局-圣杯布局实例
查看>>