traits技术详解

简介: STL模版库非常强调软件的复用,traits技术是采用的重要手段。traits提取不同类的共性,以便能统一处理。traits技术依靠显示模版特殊化来把代码中因类型不同而发生变化的片段拖出来,用统一的接口来包装。
STL模版库非常强调软件的复用,traits技术是采用的重要手段。traits提取不同类的共性,以便能统一处理。traits技术依靠显示模版特殊化来把代码中因类型不同而发生变化的片段拖出来,用统一的接口来包装。这个接口可以包含一个C++类所能包含的任何东西,如内嵌类型、成员函数、成员变量。作为客户的模版代码,可以通过traits模版类所公开的接口来简洁访问。

示例:一直整形数组类CIntArray,浮点数组类CFloatArray,求整形或浮点数组的和乘以相应倍数并输出。代码如下:

[cpp]  view plain copy
  1. #include "stdafx.h"  
  2. #include<iostream>  
  3.   
  4. using namespace std;  
  5. class CIntArray  
  6. {  
  7.     int a[10];  
  8. public:  
  9.     CIntArray()  
  10.     {  
  11.         for(int i = 0;i < 10;i++)  
  12.         {  
  13.             a[i] = i+1;  
  14.         }  
  15.     }  
  16.     int GetSum(int times)  
  17.     {  
  18.         int sum=0;  
  19.         for(int i=0;i<10;i++)  
  20.         {  
  21.             sum+=a[i];  
  22.         }  
  23.         return sum*times;  
  24.     }  
  25. };  
  26.   
  27. class CFloatArray  
  28. {  
  29.     float f[10];  
  30. public:  
  31.     CFloatArray()  
  32.     {  
  33.         for(int i=1;i<=10;i++)  
  34.             f[i-1]=1.0f/i;  
  35.     }  
  36.     float GetSum(float times)  
  37.     {  
  38.         float sum=0.0f;  
  39.         for(int i=0;i< 10;i++)  
  40.         {  
  41.             sum+=f[i];  
  42.         }  
  43.         return sum*times;  
  44.     }  
  45. };  
  46.   
  47. int _tmain(int argc, _TCHAR* argv[])  
  48. {  
  49.     CIntArray intary;  
  50.     CFloatArray fltary;  
  51.     cout<<"3 times of sum of int array is"<<intary.GetSum(3)<<endl;  
  52.     cout<<"3.2 times of sum of float array is"<<fltary.GetSum(3.2f)<<endl;  
  53.     return 0;  
  54. }  

运行结果如下:


通过对上面的代码进行分析,CintArray、CFloatArray功能相似,在main函数中都是通过调用两个类的GetSum函数完成。 那么可以通过设计一个类的接口来完成上述功能。

[cpp]  view plain copy
  1. #include "stdafx.h"  
  2. #include<iostream>  
  3.   
  4. using namespace std;  
  5. class CIntArray  
  6. {  
  7.     int a[10];  
  8. public:  
  9.     CIntArray()  
  10.     {  
  11.         for(int i = 0;i < 10;i++)  
  12.         {  
  13.             a[i] = i+1;  
  14.         }  
  15.     }  
  16.     int GetSum(int times)  
  17.     {  
  18.         int sum=0;  
  19.         for(int i=0;i<10;i++)  
  20.         {  
  21.             sum+=a[i];  
  22.         }  
  23.         return sum*times;  
  24.     }  
  25. };  
  26.   
  27. class CFloatArray  
  28. {  
  29.     float f[10];  
  30. public:  
  31.     CFloatArray()  
  32.     {  
  33.         for(int i=1;i<=10;i++)  
  34.             f[i-1]=1.0f/i;  
  35.     }  
  36.     float GetSum(float times)  
  37.     {  
  38.         float sum=0.0f;  
  39.         for(int i=0;i< 10;i++)  
  40.         {  
  41.             sum+=f[i];  
  42.         }  
  43.         return sum*times;  
  44.     }  
  45. };  
  46.   
  47. template<class T>  
  48. class CApply  
  49. {  
  50. public:  
  51.     float GetSum(T& t,float inpara)  
  52.     {  
  53.         return t.GetSum(inpara);  
  54.     }  
  55. };  
  56.   
  57. int _tmain(int argc, _TCHAR* argv[])  
  58. {  
  59.     CIntArray intary;  
  60.     CFloatArray fltary;  
  61.   
  62.     CApply<CIntArray> c1;  
  63.     CApply<CFloatArray> c2;  
  64.   
  65.     cout<<"3 times of sum of int array is"<<c1.GetSum(intary,3)<<endl;  
  66.     cout<<"3.2 times of sum of float array is"<<c2.GetSum(fltary,3.2f)<<endl;  
  67.     return 0;  
  68. }  

程序运行结果为:


通过对上面的代码进行分析,CintArray、CFloatArray功能相似,在main函数中都是通过调用两个类的GetSum函数完成。 那么可以通过设计一个类的接口来完成上述功能。如何解决输入、输出参数类型的不同呢?这就需要本文介绍的traits技术了。


目录
相关文章
|
关系型数据库 物联网 PostgreSQL
沉浸式学习PostgreSQL|PolarDB 11: 物联网(IoT)、监控系统、应用日志、用户行为记录等场景 - 时序数据高吞吐存取分析
物联网场景, 通常有大量的传感器(例如水质监控、气象监测、新能源汽车上的大量传感器)不断探测最新数据并上报到数据库. 监控系统, 通常也会有采集程序不断的读取被监控指标(例如CPU、网络数据包转发、磁盘的IOPS和BW占用情况、内存的使用率等等), 同时将监控数据上报到数据库. 应用日志、用户行为日志, 也就有同样的特征, 不断产生并上报到数据库. 以上数据具有时序特征, 对数据库的关键能力要求如下: 数据高速写入 高速按时间区间读取和分析, 目的是发现异常, 分析规律. 尽量节省存储空间
1015 1
|
存储 弹性计算 架构师
云服务器基准性能测试
随着数字化的不断发展,企业 IT 上云早已是大势所趋,通常上云的第一步是选一款云服务器。然而云服务器的型号众多,如阿里云的云服务器规格就多达上百款(详见https://help.aliyun.com/document_detail/25378.html),因此在选择具体一款规格的云服务器时,通常需要对云服务器的性能做一个基准测试,然后再做一轮业务测试。本最佳实践适合利用标准的benchmark工具对云服务器的CPU、内存、网络和磁盘性能进行测试的场景。
1784 1
云服务器基准性能测试
|
弹性计算 人工智能 大数据
使用阿里云服务器ECS可以干嘛?
阿里云服务器ECS可应用于六大场景:网站托管(如博客、官网、电商平台)、应用开发测试、大数据处理、企业CRM/ERP系统、游戏服务器及在线教育流媒体。提供高性能计算、高并发处理能力及稳定带宽,适合各种业务需求。
318 6
|
JavaScript
vue + d3.js(v6) 绘制【柱状图/条形图】(含动画和交互)
vue + d3.js(v6) 绘制【柱状图/条形图】(含动画和交互)
190 0
|
11月前
|
存储 负载均衡 云计算
抖音服务器是什么样的
抖音服务器采用分布式云计算架构,遍布全国多个数据中心,如北上广、四川和贵州等地,利用高带宽、云集群并发及OSS、CDN、SLB等技术,确保大量用户同时流畅观看视频。这不仅需要强大的服务器群支持,还需精准的负载均衡与内容分发网络,保障用户体验。
498 1
|
机器学习/深度学习 搜索推荐 PyTorch
【机器学习】图神经网络:深度解析图神经网络的基本构成和原理以及关键技术
【机器学习】图神经网络:深度解析图神经网络的基本构成和原理以及关键技术
3037 3
|
消息中间件 存储 Cloud Native
深度剖析 RocketMQ 5.0,架构解析:云原生架构如何支撑多元化场景?
了解 RocketMQ 5.0 的核心概念和架构概览;然后我们会从集群角度出发,从宏观视角学习 RocketMQ 的管控链路、数据链路、客户端和服务端如何交互;学习 RocketMQ 如何实现数据的存储,数据的高可用,如何利用云原生存储进一步提升竞争力。
142749 3
|
网络协议 应用服务中间件 Linux
【Nginx】在线安装与离线安装
【Nginx】在线安装与离线安装
618 0
|
弹性计算 负载均衡 并行计算
实战案例分析:ECS在电商和大数据领域的应用
本文通过实际案例分析,深入探讨了云服务器ECS在电子商务和大数据领域的应用。在电子商务网站部署方面,我们介绍了如何使用ECS构建稳定的电商平台,包括弹性伸缩和负载均衡的实践。通过示例代码,读者可以了解如何创建ECS实例、配置负载均衡器,以及设置自动伸缩策略,以应对不同流量情况。
695 1