指数函数的模板元编程

指数函数的模板元编程

在程序中需要将一个正整数(如123)转换成一个固定长的串(如8位,00000123)。算法有很多了。我采用可以这个方法123+10^8=100000123,将100000123转换成串"100000123",然后返回这个串的子串substr(1)。在这个方法当中会涉及指数的运算,C++只能作浮点数的指数运算,为提高效率使用模板元编程,将这一过程提前到编译期完成。程序很简单,大家看看就明白了:

    template
< int  d, int  pow >
    
struct  Power
    {
        
static   const   int  value  =  Power < d,pow - 1 > ::value  *  d;
    };

    template
< int  d >
    
struct  Power < d, 0 >
    {
        
static   const   int  value  =   1 ;
    };

    
/* *
     * 该函数将一个整数转换成固定长度的0不齐的串,如12->"00012"
     
*/
    template
< int  len >
    std::
string  int_cast_zerostr( const   int  i)
    {

        std::
string  result   =  boost::lexical_cast < std:: string > (Power < 10 ,len > ::value  +  i);
        
return  result.substr( 1 );
    }

如果要将12转换成"00000012",可使用函数int_cast_zerostr<8>(12)。

谢谢小明的提醒,想起Boost有个format库,所以可以这样
    boost::format f( " %08d " );
    std::
string  s  =  (f % 12 ).str();
    std::cout
<< s; //s = "00000012"
不过个人更喜欢int_cast_zerostr<8>(12)方式。呵呵!

你可能感兴趣的:(指数函数的模板元编程)