/*******************************************************
* 文件名称: TraitsTest.cpp
* 功能描述: Traits匹配不同的类型
* 作 者: Haley
* 模块名: Traits
* 公司名: Boolan
* 修改历史:
* 2017-03-22 Haley 创建该文件
*********************************************************/
#include <iterator> // std::iterator_traits
#include <iostream> // std::cout
#include <string>
#include <sstream>
using namespace std;
// 定义类型萃取机type_traits
template<typename T>
struct type_traits
{
typedef typename T::type_traits valueType;
};
// 声明米单位类型
struct meter
{
typedef meter type_traits;
private:
string m_str;
public:
// 定义静态的转换系数
static int m_convertData;
// 定义构造函数,拷贝构造函数
meter(){}
meter(string str):m_str(str){}
meter(double val, int con=1)
{
stringstream sstring;
// 输出值为:距离*转换系数
sstring << val*con;
sstring >> m_str;
// 在输出值末尾加上基本单位
m_str = m_str + "m";
}
meter(meter& met)
{
m_str = met.m_str;
}
// 重载运算符<<
friend ostream& operator<<(ostream& os, const meter& str)
{
os << str.getSting();
return os;
}
string getSting() const
{
return m_str;
}
};
// 声明千米单位类型(统一以米为基本单位)
struct kilometer
{
typedef meter type_traits;
public:
// 定义静态的转换系数
static int m_convertData;
};
// 声明秒单位类型
struct second
{
typedef second type_traits;
private:
string m_str;
public:
// 定义静态的转换系数
static int m_convertData;
// 定义构造函数,拷贝构造函数
second(){}
second(string str):m_str(str){}
second(double val, int con=1)
{
stringstream sstring;
// 输出值为:时间*转换系数
sstring << val*con;
sstring >> m_str;
// 在输出值末尾加上基本单位
m_str = m_str + "s";
}
second(second& met)
{
m_str = met.m_str;
}
// 重载运算符<<
friend ostream& operator<<(ostream& os, const second& str)
{
os << str.getSting();
return os;
}
string getSting() const
{
return m_str;
}
};
// 声明分钟单位类型(统一以秒为基本单位)
struct minute
{
typedef second type_traits;
public:
// 定义静态的转换系数
static int m_convertData;
};
int meter::m_convertData = 1;
int kilometer::m_convertData = 1000;
int second::m_convertData = 1;
int minute::m_convertData = 60;
// 声明计量单位Measurement
template<typename I>
struct Measurement
{
private:
double value;
public:
Measurement(double val):value(val){}
// 定义获取单位类型对应数值函数
typename type_traits<I>::valueType description()
{
typedef typename type_traits<I>::valueType valType;
// 获取不同计量单位的转换系数
int iconv = I::m_convertData;
valType typeVal(value, iconv);
return typeVal;
}
};
// 计量单位的泛化类型(如果为除距离和时间的其他单位)
template<>
struct Measurement<double>
{
private:
double value;
public:
Measurement(double val):value(val){}
string description()
{
stringstream sstring;
string str;
sstring << value;
sstring >> str;
return str;
}
};
// 测试通过Traits获取不同的转换后结果并显示
void test_traits()
{
Measurement<meter> m1 = 20;
Measurement<kilometer> m2 = 11.2;
meter me = m1.description();
Measurement<second> m3 = 20;
Measurement<minute> m4 = 10;
Measurement<double> m5 = 10;
cout << me << endl;
cout << m2.description() << endl;
cout << m3.description() << endl;
cout << m4.description() << endl;
cout << m5.description() << endl;
}
int main(void)
{
test_traits();
return 0;
}
Haley_2013
- 粉丝: 16
- 资源: 15
最新资源
- 智能笔项目源代码全套技术资料.zip
- 在线考试系统项目源代码全套技术资料.zip
- 高等数学学习资料合集 高等数学(工本)mind
- 西门子V90效率倍增-伺服驱动功能库详解简易循环功能库之Homing-V90PN.mp4
- 自考04741计算机网络原理真题及答案及课件
- 基于STM32芯片开发 安防系统 完整作品
- 4_base.apk.1
- 学生导师双选系统项目源代码全套技术资料.zip
- 自考02318《计算机组成原理》试题及答案 2014-2018及课件
- 图书管理系统,仅供参考
- 数据科学与大数据毕业设计系统项目源代码全套技术资料.zip
- 全国自考02197概率论与数理统计(二)试题及答案2014-2019
- CHGCOLOR压缩包
- 多轮自动红队方法提升大语言模型安全性
- python语言kssp爬虫程序代码XQZQ.txt
- 亲测源码云赏V7.0微信视频打赏系统源码已测试完整无错版
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈