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

时间:2015-03-21 16:15:52

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

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

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

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

我发现了一篇博文中有一些很有前途的指导,该帖子使用了来自result_of的{​​{1}}和<type_traits>,但我似乎无法让它发挥作用。

decltype

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

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

我不知道我做错了什么,或者这是VC ++尚未处理的事情(或两者兼而有之!)。我在错误消息中看到的唯一线索是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 。调用约定不应该是__cdecl吗?

2 个答案:

答案 0 :(得分:5)

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

或者

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

答案 1 :(得分:0)

不要&#39;知道为何适用

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