我尝试声明一个变量,使其类型与我有成员函数指针的成员函数的返回类型相同。
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
吗?
答案 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;//