template< typename F, typename ... Args >
auto INVOKE(F&& fn, Args&& ... args)
-> typename std::enable_if<
std::is_member_pointer<typename std::decay<F>::type>::value,
decltype(std::mem_fn(fn)(std::forward<Args>(args)...))>::type
{
return std::mem_fn(fn)(std::forward<Args>(args)...) ;
}
template< typename F, typename ... Args >
auto INVOKE(F&& fn, Args&& ... args)
-> typename std::enable_if<
not std::is_member_pointer<typename std::decay<F>::type>::value,
decltype(std::forward<F>(fn)(std::forward<Args>(args)...))>::type
{
return std::forward<F>(fn)(std::forward<Args>(args)...);
}
It would seem that this does the trick for C++11 onward: