I tried various declarations like decltype (std :: declval (TestCBClass :: testStaticMethod))
You do not need to use std::declval and pass the actual arguments, even their types, to find out what the return type of the static / non-static member function is. Instead, you can write your own attribute to find out what the return type of this function is:
template <typename T> struct return_type; template <typename R, typename... Args> struct return_type<R(*)(Args...)> { using type = R; }; template <typename R, typename C, typename... Args> struct return_type<R(C::*)(Args...)> { using type = R; }; template <typename R, typename C, typename... Args> struct return_type<R(C::*)(Args...) const> { using type = R; }; template <typename R, typename C, typename... Args> struct return_type<R(C::*)(Args...) volatile> { using type = R; }; template <typename R, typename C, typename... Args> struct return_type<R(C::*)(Args...) const volatile> { using type = R; }; template <typename T> using return_type_t = typename return_type<T>::type; ... TestCBClass t; std::future<return_type_t<decltype(&TestCBClass::testCBArgRet)>> a = std::async(&TestCBClass::testCBArgRet, t, 1); std::future<return_type_t<decltype(&TestCBClass::testCBEmpty)>> b = std::async(&TestCBClass::testCBEmpty, t); std::future<return_type_t<decltype(&TestCBClass::testCBEmptyStatic)>> c = std::async(&TestCBClass::testCBEmptyStatic);
Demo
source share