【问题标题】:Get the return type of a method from a member function pointer从成员函数指针获取方法的返回类型
【发布时间】:2015-05-24 22:47:02
【问题描述】:

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

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

例如,给定一个指向Widget::Foo的成员函数指针fn, 我将如何声明一个变量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.0\VC\include\xrefwrap(58): error C2064: term does not evaluate to a function taking 0 arguments
      C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xrefwrap(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。调用约定不应该是__thiscall吗?

【问题讨论】:

    标签: c++ typetraits member-function-pointers decltype


    【解决方案1】:

    不知道为什么与

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

    但我认为括号中应该是指向Widget的指针。因为the first member parameter is hidden 'this', a pointer to object

    std::result_of<decltype(fn)(Widget*)>::type blah;
    
    
    
    
    #include <iostream>
    using namespace std;
    
    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;
    }
    

    输出:

    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;//
    

    【讨论】:

      【解决方案2】:
      decltype((w.*fn)()) blah;
      

      或者

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-01
        • 1970-01-01
        • 2014-12-13
        相关资源
        最近更新 更多