Chinaunix首页 | 论坛 | 博客
  • 博客访问: 396911
  • 博文数量: 48
  • 博客积分: 1820
  • 博客等级: 上尉
  • 技术积分: 705
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-28 23:10
文章分类

全部博文(48)

文章存档

2012年(1)

2011年(12)

2010年(34)

2009年(1)

分类: LINUX

2010-01-06 21:48:30

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运行正常了



阅读(1746) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~