http://www.rsdn.ru/forum/cpp.applied/4109801.aspx