http://www.cppblog.com/michaelgao/archive/2009/01/08/71527.html
http://www.cppblog.com/jacky2019/archive/2007/04/06/21375.html