c++ 11的result_of推导函数类型失败



我正在尝试下面的程序:

#include<type_traits>
using namespace std;
template <class F, class R = typename result_of<F()>::type>
R call(F& f) { return f(); }
int answer() { return 42; }
int main()
{
    call(answer); 
    return 0;
}

"call(answer)"编译失败

VC说'R call(F&)'无法推断'R'的模板参数

GCC提示|注意:模板参数演绎/替换失败:|错误:函数返回函数

我不确定"函数名"是否可以用于模板。我哪里出错了,如何让我的电话(回答)工作?

在以下情况下可以使用转发引用:

#include<type_traits>
#include<utility>
#include<cassert>
using namespace std;
template <class F, class R = typename result_of<F()>::type>
R call(F&& f) { return std::forward<F>(f)(); }
int answer() { return 42; }
int main()
{
    assert(call(answer) == 42);
    return 0;
}

通常可以避免麻烦。

也就是说,@ tc很好地解释了为什么你的代码不能工作。在他的回答中。

您将f调用为左值,因此:

template <class F, class R = typename result_of<F&()>::type>
//                                               ^
R call(F& f) { return f(); }

我想你可以避免第二个模板参数,并使用autodecltype()的组合。

之类的
#include<type_traits>
using namespace std;
template <class F>
auto call(F& f) -> decltype( f() )
 { return f(); } 
int answer()
 { return 42; }
int main()
{
    call(answer); 
    return 0;
}

如果你(当你)可以使用c++ 14,你可以简单地使用auto

template <class F>
auto call(F& f)
 { return f(); } 

注。

相关内容

  • 没有找到相关文章

最新更新