/* 02.14.2009 ccsdu2004@yahoo.com.cn www.gaimo.net */ template<typename T> class link_t : public noncopyable { public: link_t(T _t): t(_t){} void operator()(const T &_t) { sum += _t; sum += t; } private: T t; static T sum ;//= 0; }; //template<typename T> //T link_t<T>::t; template <typename T> T link_t<T>::sum; template<> class link_t<string> { public: link_t(string _t): t(_t){} void operator()(const string &_t) { sum += _t; sum += t; } public: static string sum ; private: link_t(){}; private: string t; }; string link_t<string>::sum = ""; /* record format: id, time, record info. */ class log : public noncopyable { public: log(const string &file); ~log(); public: bool add_info(const string &); inline bool get_state(){return state;} private: void format(); private: ofstream fout; vector<string> debug_info; scoped_ptr<Time> time_ptr; private: bool state; private: class format_str { public: format_str(string &_time): time(_time){} public: void operator()(string & _info) { //in there using format function is best. string info(lexical_cast<string>(itr++)); info += " "; info += time; info += " "; info += _info; info.swap(_info); } private: string time; static int itr; }; }; int log::format_str::itr=0; log::log(const string &file):state(false) { debug_info.clear(); time_ptr.reset(new Time()); fout.open(file.c_str()); if(fout.fail()==false) state = true; } log::~log() { } bool log::add_info(const string & info) { if(get_state()==false) return false; if(debug_info.size() == max_debug_info_num) { format(); string *temp = new string(); if(temp == NULL) { fout.close(); return false; } link_t<string> str("/n"); for_each(debug_info.begin(),debug_info.end(),str); delete temp; fout<<str.sum<<endl; fout.close(); return false; } else { debug_info.push_back(info); return true; } } void log::format() { string time = time_ptr->get_time_str(); format_str f(time); for_each(debug_info.begin(),debug_info.end(),f); } int main() { log l("log.log"); for(int i=0;i<2000;i++) { if(false == l.add_info("www.gaimo.net")) { cout<<"ok"<<endl; break; } cout<<i<<endl; } system("pause"); return 0; } Time类见上文