#include #include #include class tracer { public: tracer(const std::string& name); ~tracer(); template tracer& operator<<(const T& t); std::string str(); tracer& str(const std::string& s); private: static std::ostringstream log; std::string name_; }; std::ostringstream tracer::log(""); tracer::tracer(const std::string& name) { log << "\n starting: " << (name_ = name); } tracer::~tracer() { log << "\n ending: " << name_; } template tracer& tracer::operator <<(const T& t) { log << t; return *this; } std::string tracer::str() { return log.str(); } tracer& tracer::str(const std::string& s) { log.str(s); return *this; } //----< test tracer >------------------------------------------------ void fun2(const std::string& say) { tracer t("fun2"); t << "\n argument = " << say; } void fun1() { tracer t("fun1"); std::string s = "my local string"; int count = 3; t << "\n " << s << ", my count = " << count; fun2("hello CSE687"); } void main() { std::cout << "\n MT3Q1b - Tracer"; std::cout << "\n ================="; tracer t("main"); fun1(); std::cout << t.str().c_str() << "\n"; std::cout << t.str("\n That's all Folks!\n\n").str(); }