擴展progress_timer的計時精度

 progress對外輸出精度只有小數點後兩位(這點能夠運行上節程序進行驗證),即精確到0.01秒。ios

咱們使用模板技術仿造一個progress_timer編寫一個新類:new_progress_timer,以實現任意精度的輸出。編程

 new_progress_timer一樣繼承自timer,只是編程了模板類。模板參數N指明瞭輸出精度,默認值爲2,與progress_timer相同。spa

#include <boost\timer.hpp>
#include  <boost\progress.hpp>
#include <boost\static_assert.hpp>
#include <iostream>
using namespace boost;
using namespace std;

//使用模板參數實現progress_timer
template<int N=2>
class new_progress_timer:public boost::timer
{
public:
    new_progress_timer(std::ostream &os=std::cout):m_os(os)
    {
        BOOST_STATIC_ASSERT(N>=0&&N<=10);
    }

    ~new_progress_timer(void)
    {
        try{
            //保持流的狀態
            std::istream::fmtflags old_flags=m_os.setf(std::istream::fixed,std::istream::floatfield);

            std::streamsize old_prec=m_os.precision(N);

            m_os<<elapsed()<<"s\n"<<std::endl;

            m_os.flags(old_flags);
            m_os.precision(old_prec);

        }
        catch( ...)
        {
        }
    }

private:
    std::ostream &m_os;
};

//當精度爲2時,使用下面這個

template<>
class new_progress_timer<2>:public boost::progress_timer
{};

int main()
{
     new_progress_timer<10>     t;  //聲明一個計時器,開始計時
   //dosomething
    for(int i=0;i<100;i++)
    {
        cout<<"a";
    }
    cout<<endl;
}
相關文章
相關標籤/搜索