如何获取return类型的成员函数指针

how to get a return type of a member function pointer

有没有办法确定成员函数指针的 return 类型?

代码示例:

///// my library
void my_func(auto mptr) { // have to use `auto`
  // some logic based on a return type of mptr: int, string, A, etc.
}

///// client code
struct A {
  int foo();
  std::string bar(int);
};

class B{
public:
  A func(int, double);
};
// ... and many other classes

my_func(&A::foo);
my_func(&A::bar);
my_func(&B::func);
// ... many other calls of my_func()

我需要“填写”my_func()

编辑: 我不能使用 std::result_of/std::invoke_result,因为我不知道 mptr 的完整参数列表。一个方法应该用哪个参数调用并不重要,因为我没有调用它。我想避免创建 mptr 的基数 class 的对象,即使我能够确定它(使用 declval 没问题)。

您可以使用部分模板特化来确定 mptr 的 return 类型:

template <typename T>
struct ReturnType;

template <typename Object, typename Return, typename... Args>
struct ReturnType<Return (Object::*)(Args...)>
{
    using Type = Return;
};

void my_func(auto mptr) {
  typename ReturnType<decltype(mptr)>::Type obj;
}

Live Demo

您可以编写一个函数来推导成员函数指针的类型,并且 return 是推导的 return 类型。注意只需要声明,不需要定义

template <typename C, typename Ret, typename... Args>
auto ret_type(Ret (C::*)(Args...)) -> Ret;

void my_func(auto mptr) 
{ 
  using type = decltype(ret_type(mptr));
}

在我看来,这也比专业化解决方案更容易阅读。

这是一个demo

您还可以通过添加重载来解释 cv-限定符。例如

template <typename C, typename Ret, typename... Args>
auto ret_type(Ret (C::*)(Args...) const) -> Ret;

这是一个demo