Use decltype instead of typedefs for function pointers