AutoTimer「Making Pimpl Easy」版

2677 ワード

AutoTimer.h

#include <boost/enable_shared_from_this.hpp>

#include <string>

using namespace std;



class AutoTimer : public pimpl<AutoTimer>::pointer_semantics,

	  public boost::enable_shared_from_this<AutoTimer>

{

public:

	AutoTimer(const std::string &name);

	~AutoTimer(void);

};


AutoTimer.cpp

#include "AutoTimer.h"

#include <iostream>

#include <windows.h>

#include <string>



template<> struct pimpl<AutoTimer>::implementation

{

	implementation (string k) : mName(k)   

	{ 

		mStartTime = GetTickCount();

	}



	double GetElapsed() const;



	string mName;

	DWORD mStartTime;



};



template<> double pimpl<AutoTimer>::implementation::GetElapsed() const

{

	return (GetTickCount()-mStartTime) / 1e3;

}



AutoTimer::AutoTimer (const std::string &name) : base(name) 

{



}



AutoTimer::~AutoTimer(void)

{

	 implementation const& self = **this;

	 std::cout<<self.mName<< ": took " << self.GetElapsed()

	 	<< " secs" << std::endl;

}




main.cpp

int _tmain(int argc, _TCHAR* argv[])

{

	AutoTimer timer("MyTimer");



	for (int i = 0; i < 1000; ++i)

	{

		cout << ".";

	}

	cout << endl;



	return 0;

}