c++模板应用之--traits
利用c++的模板技术可以极大抽象程序的设计和实现,
扩展性会变的很强 。
c++的很多有名的库都利用了c++的模板技术,
并且复合了许多设计模式 。
c++ 实现的trait可以解决很多实际问题
比如我要实现一个账目汇总的模块
那么可能我要实现这样一个求和函数
long sum( int a, int b) ;
但是我们某时刻我不需要如此传入int参数
而是传入一个float
那么我们肯能会定义另一个函数
double sum( float a, float b) ;
有人说多加一个sum的 重载很ok啊,
但是在现实应用中并不会总是这么让你随意,
尤其平台开发中更应该将接口设计的很抽象
我定义一个trait
template< typename T >
class traits ;
template <>
class traits< int >
{
public:
typedef long Acct ;
enum{ zero = 0 };
};
template <>
class traits< float >
{
public:
typedef double Acct ;
static Acct const zero ;
};
double const traits< float >::zero = 0.0 ;
那么我定义sum函数可以这样
template< typename T >
class traits< T >::Acct sum( T * a ,std::size_t size )
{
typedef class traits< T >::Acct Acct ;
Acct total = traits< T >::zero ;
for( std::size_t i =0 ; i
{
total += *(a +i) ;
}
return total ;
}
这样我们就可以这样自如的运用sum 了
int main()
{
int arrI [ 6] ={ 21 ,90 ,21 ,90 ,21 ,90} ;
float arrF [ 6 ] ={ 21.5 ,90.8,21.5 ,90.8 ,21.5 ,90.8} ;
cout<<"\n sum of int array:"<< sum ( arrI ,sizeof(arrI)/sizeof(int) ) ;
cout<<"\n sum of float array:"<< sum ( arrF ,sizeof(arrF)/sizeof(float) ) ;
return 0;
}
好了,我的trait运行正常了
阅读(1797) | 评论(0) | 转发(1) |