博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STL学习之旅二:traits技术
阅读量:5063 次
发布时间:2019-06-12

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

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

下面是一个简单实例:已知整型数组类CIntArray,浮点数组类CFloatArray,求整型或浮点数组的和乘于相应的倍数并输出。

 

#include
<
iostream
>
using
 
namespace
 std;
class
 CIntArray
{
private
:
    
int
 a[
10
];
public
:
    CIntArray()
    {
        
for
(
int
 i
=
0
;i
<
10
;i
++
)
        {
            a[i]
=
i
+
1
;
        }
    }
    
int
 GetSum(
int
 times);
};
int
 CIntArray::GetSum(
int
 times)
{
    
int
 sum
=
0
;
    
for
(
int
 i
=
0
;i
<
10
;i
++
)
    {
        sum
+=
a[i];
    }
    
return
 sum
*
times;
}
class
 CFloatArray
{
private
:
    
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
 NumTraits
{
};
//
模板特化  将返回类型和输入参数都定义成相同的名称,为编制模板类共同的调用接口做准备 
template
<>
class
 NumTraits
<
CIntArray
>
{
public
:
    typedef 
int
 resulttype;
    typedef 
int
 inputpara;
};
template
<>
class
 NumTraits
<
CFloatArray
>
{
public
:
    typedef 
float
 resulttype;
    typedef 
float
 inputpara;
};
//
提供公共接口
/*
template<class T>
class CApply
{
public:
    //此法虽从结果上看,没有问题,但是从严密角度上不够严密。
    //如果问题复杂了,结果可能就不正确了。
    float GetSum(T& t,float inpara)
    {
        return t.GetSum(inpara);
    }
};
*/
/*
template<class T>
class CApply
{
public:
    NumTraits<T>::resulttype GetSum(T& t,NumTraits<T>::inputpara inpara)
    {
        return t.GetSum(inpara);
    }
};
*/
//
进一步简化函数形式
template
<
class
 T
>
class
 CApply
{
public
:
    typedef NumTraits
<
T
>
::resulttype result;
    typedef NumTraits
<
T
>
::inputpara input;
    result GetSum(T
&
 t, input inpara)
    {
        
return
 t.GetSum(inpara);
    }
};
void
 main()
{
    CIntArray intary;
    CFloatArray fltary;
//
    cout<<"整型数组的和3倍是:"<<intary.GetSum(3)<<endl;
//
    cout<<"浮点数组和3.2倍是:"<<fltary.GetSum(3.2f)<<endl;
    CApply
<
CIntArray
>
 c1;
    CApply
<
CFloatArray
>
 c2;
    cout
<<
"
整型数组的和3倍是:
"
<<
c1.GetSum(intary,
3
)
<<
endl;
    cout
<<
"
浮点数组和3.2倍是:
"
<<
c2.GetSum(fltary,
3.2f
)
<<
endl;
}

 

 

转载于:https://www.cnblogs.com/wintergrass/archive/2011/04/27/2029981.html

你可能感兴趣的文章
Properties
查看>>
Java_I/O输入输出_实现读取文件时出现一个表示读取进度的进度条。可以使用java.swing包提供的输入流类ProgressMonitorInputStream...
查看>>
Linux Running State Process ".so"、"code" Injection Technology
查看>>
php学习笔记
查看>>
AJAX的使用
查看>>
在Windows 8.1及IE 11中如何使用HttpWatch
查看>>
时间仍在,是我们在飞逝
查看>>
[转]数据挖掘中所需的概率论与数理统计知识、上
查看>>
centos一键安装lnmp成功后无法访问ip(解决办法)
查看>>
在JS中使用全局变量
查看>>
Django学习-4-request获取数据
查看>>
python----redis
查看>>
证明:37的500次方减去37的100次方的结果是10的倍数!
查看>>
android 自定义流布局实现
查看>>
rzsz的安装
查看>>
批处理常见疑问
查看>>
枚举数与可枚举类型(笔记)
查看>>
marquee标签使用【转载】
查看>>
3.1 查找文本
查看>>
详细的SQL中datediff用法
查看>>