不错，去除 boost::function 的使用，改用 template