traits技术详解

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

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

#include "stdafx.h"
#include<iostream>

using namespace std;
class CIntArray
{
	int a[10];
public:
	CIntArray()
	{
		for(int i = 0;i < 10;i++)
		{
			a[i] = i+1;
		}
	}
	int GetSum(int times)
	{
		int sum=0;
		for(int i=0;i<10;i++)
		{
			sum+=a[i];
		}
		return sum*times;
	}
};

class CFloatArray
{
	float f[10];
public:
	CFloatArray()
	{
		for(int i=1;i<=10;i++)
			f[i-1]=1.0f/i;
	}
	float GetSum(float times)
	{
		float sum=0.0f;
		for(int i=0;i< 10;i++)
		{
			sum+=f[i];
		}
		return sum*times;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	CIntArray intary;
	CFloatArray fltary;
	cout<<"3 times of sum of int array is"<<intary.GetSum(3)<<endl;
	cout<<"3.2 times of sum of float array is"<<fltary.GetSum(3.2f)<<endl;
	return 0;
}

运行结果如下:


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

#include "stdafx.h"
#include<iostream>

using namespace std;
class CIntArray
{
	int a[10];
public:
	CIntArray()
	{
		for(int i = 0;i < 10;i++)
		{
			a[i] = i+1;
		}
	}
	int GetSum(int times)
	{
		int sum=0;
		for(int i=0;i<10;i++)
		{
			sum+=a[i];
		}
		return sum*times;
	}
};

class CFloatArray
{
	float f[10];
public:
	CFloatArray()
	{
		for(int i=1;i<=10;i++)
			f[i-1]=1.0f/i;
	}
	float GetSum(float times)
	{
		float sum=0.0f;
		for(int i=0;i< 10;i++)
		{
			sum+=f[i];
		}
		return sum*times;
	}
};

template<class T>
class CApply
{
public:
	float GetSum(T& t,float inpara)
	{
		return t.GetSum(inpara);
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	CIntArray intary;
	CFloatArray fltary;

	CApply<CIntArray> c1;
	CApply<CFloatArray> c2;

	cout<<"3 times of sum of int array is"<<c1.GetSum(intary,3)<<endl;
	cout<<"3.2 times of sum of float array is"<<c2.GetSum(fltary,3.2f)<<endl;
	return 0;
}

程序运行结果为:


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


相关文章
|
24天前
|
存储 算法 编译器
【C++ TypeName用法 】掌握C++中的TypeName:模板编程的瑞士军刀
【C++ TypeName用法 】掌握C++中的TypeName:模板编程的瑞士军刀
233 0
|
22天前
|
算法 编译器 C++
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits 判断 Lambda表达式类型?
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits 判断 Lambda表达式类型?
36 4
|
28天前
|
编译器 C++ 容器
【C++ 泛型编程 进阶篇】:用std::integral_constant和std::is_*系列深入理解模板元编程(三)
【C++ 泛型编程 进阶篇】:用std::integral_constant和std::is_*系列深入理解模板元编程
23 0
|
28天前
|
安全 C++
【C++ 泛型编程 进阶篇】:用std::integral_constant和std::is_*系列深入理解模板元编程(一)
【C++ 泛型编程 进阶篇】:用std::integral_constant和std::is_*系列深入理解模板元编程
42 1
|
28天前
|
编译器 C++ 开发者
【C++ 泛型编程 进阶篇】:用std::integral_constant和std::is_*系列深入理解模板元编程(二)
【C++ 泛型编程 进阶篇】:用std::integral_constant和std::is_*系列深入理解模板元编程
36 1
|
24天前
|
存储 安全 C++
【C++ 17 新特性 std::variant】C++ std::variant 的 深入探讨
【C++ 17 新特性 std::variant】C++ std::variant 的 深入探讨
55 1
|
23天前
|
JSON C++ 数据格式
【C++ 泛型编程 进阶篇】深入解析C++中的std::conditional_t与std::void_t:模板编程的神器
【C++ 泛型编程 进阶篇】深入解析C++中的std::conditional_t与std::void_t:模板编程的神器
79 0
|
24天前
|
算法 编译器 C++
【C++ 泛型编程 中级篇】C++ 编译时技术:探索 if constexpr 和 std::enable_if
【C++ 泛型编程 中级篇】C++ 编译时技术:探索 if constexpr 和 std::enable_if
36 0
|
22天前
|
存储 传感器 安全
【C++ std::variant】深入探索 C++ std::variant:构造方法与实践应用
【C++ std::variant】深入探索 C++ std::variant:构造方法与实践应用
78 5
|
24天前
|
存储 安全 编译器
【C++ 17 泛型容器对比】C++ 深度解析:std::any 与 std::variant 的细微差别
【C++ 17 泛型容器对比】C++ 深度解析:std::any 与 std::variant 的细微差别
46 1