我有一个功能:
std::function<void(sp_session*)> test(void(MainWindow::*handler)())
{
return ...;
}
我想用等效的std :: mem_fn类型替换handler的类型。
什么类型?
我试过了:
std::function<void(sp_session*)> test(std::mem_fn<void(), MainWindow> handler)
{
return ...;
}
但VC ++ 2010会吐出这些错误:
error C2146: syntax error : missing ')' before identifier 'handler'
error C2059: syntax error : ')'
error C2143: syntax error : missing ';' before '{'
error C2447: '{' : missing function header (old-style formal list?)
所以我不确定我做错了什么。
答案 0 :(得分:4)
C ++ 11活页夹系列函数(mem_fn
,bind
)返回的确切类型是未指定,这意味着它是一个实现细节,你不应该关注它。
§20.8.9 [func.bind]
template<class F, class... BoundArgs>
unspecified
bind(F&&, BoundArgs&&...);
§20.8.10 [func.memfn]
template<class R, class T>
unspecified
mem_fn(R T::* pm);
“解决方法”:使用模板。
template<class F>
std::function<void(sp_session*)> test(F handler)
{
return ...;
}
答案 1 :(得分:1)
std::mem_fn
不是您要找的类型
您需要的类型是std::function
,它将实例作为参数:
std::function<void(sp_session*)> test(std::function<void(MainWindow *)> handler)
它可以绑定到成员函数,并且仅作为第一个参数与实例一起使用 如果在原始函数中你会这样做:
instance->*handler();
在新功能中:
handler(instance);