Reworked function_wrapper template and added the overload() function