http://www.cppblog.com/Leaf/archive/2009/08/11/92897.html
http://blog.csdn.net/ltttklyzy/article/details/6330692