How can I determine the return type of a C++11 member function

You may also use std::result_of and decltype, if you prefer to list arguments types rather than the corresponding dummy values, like this:

#include <iostream>
#include <utility>
#include <type_traits>

struct foo {
  int    memfun1(int a) const { return a;   }
  double memfun2(double b) const { return b; }
};

int main() {
  std::result_of<decltype(&foo::memfun1)(foo, int)>::type i = 10;
  std::cout << i << std::endl;
  std::result_of<decltype(&foo::memfun2)(foo, double)>::type d = 12.9;
  std::cout << d << std::endl;
}

DEMO here.


How can I determine the return type of a C++11 member function?

Answer:

You could use decltype and std::declval like the toy example below:

#include <iostream>
#include <utility>

struct foo {
  int    memfun1(int a) const { return a;   }
  double memfun2(double b) const { return b; }
};

int main() {
  decltype(std::declval<foo>().memfun1(1)) i = 10;
  std::cout << i << std::endl;
  decltype(std::declval<foo>().memfun2(10.0)) d = 12.9;
  std::cout << d << std::endl;
}

LIVE DEMO


I've tried various declarations such as decltype(std::declval(TestCBClass::testStaticMethod))

You don't have to use std::declval and pass actual arguments, not even their types, just to know what is the return type of a static/non-static member function. Instead, you can write your own trait to know what is the return type of a given function:

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