从成员函数指针获取方法的返回类型

Get the return type of a method from a member function pointer

本文关键字:方法 返回类型 获取 指针 成员 函数      更新时间:2023-10-16

我试图声明一个变量,使其类型与我有成员函数指针的成员函数的返回类型相同。

class Widget {
    public:
        std::chrono::milliseconds Foo();
};

例如给定指向CCD_ 2的成员函数指针CCD_,如何声明一个变量blah,使其获得Widget::Foo的返回类型(std::chrono::milliseconds)?

我从一篇博客文章中找到了一些很有前景的指导,该文章使用了<type_traits>中的result_ofdecltype,但我似乎无法使其发挥作用。

auto fn = &Widget::Foo;
Widget w;
std::result_of<decltype((w.*fn)())>::type blah;

这种方法对我来说很有意义,但VC++2013不喜欢它。

C:Program Files (x86)Microsoft Visual Studio 12.0VCincludexrefwrap(58): error C2064: term does not evaluate to a function taking 0 arguments
      C:Program Files (x86)Microsoft Visual Studio 12.0VCincludexrefwrap(118) : see reference to class template instantiation 'std::_Result_of<_Fty,>' being compiled
      with
      [
          _Fty=std::chrono::milliseconds (__cdecl Widget::* )(void)
      ]
      scratch.cpp(24) : see reference to class template instantiation 'std::result_of<std::chrono::milliseconds (__cdecl Widget::* (void))(void)>' being compiled

我不知道我是做错了什么,还是VC++还没有处理好这件事(或者两者都有!)。我在错误消息中看到的唯一线索是__cdecl。呼叫约定不应该是fn0吗?

decltype((w.*fn)()) blah;

std::result_of<decltype(fn)(Widget)>::type blah;

不知道它为什么与一起工作

std::result_of<decltype(fn)(Widget)>::type blah;

但我认为括号中应该有一个指向Widget的指针。因为第一个成员参数是隐藏的"this",指向对象的指针

std::result_of<decltype(fn)(Widget*)>::type blah;
class Widget
{
public:
    virtual int foo() = 0;
};
int Widget::foo() { }
int main() {
    // Your code goes here
    auto fn = &Widget::foo;
    std::result_of<decltype(fn)(Widget*)>::type blah = 5;
    std::cout << blah;
    return 0;
}
// output: 5

此外,我们不能创建抽象类的对象,所以代码不会编译,如果Widget是一个抽象类,而不是它的指针将在括号中

std::result_of<decltype(fn)(Widget)>::type blah = 5;

编译错误:

error: cannot declare parameter to be of abstract type 'Widget'
  std::result_of<decltype(fn)(Widget)>::type blah = 5;//
error: incomplete type 'std::result_of<int (Widget::*(Widget))()>' used in    nested name specifier
  std::result_of<decltype(fn)(Widget)>::type blah = 5;//