change boost::function to std::function