1

我有一个功能:

std::function<void(sp_session*)> test(void(MainWindow::*handler)())
{
    return ...;
}

我想用等效的 std::mem_fn 类型替换处理程序的类型。

类型是什么?

我试过这个:

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?)

所以我不确定我做错了什么。

4

2 回答 2

4

C++11 binder 系列函数 ( mem_fn, bind) 返回的确切类型是未指定的,这意味着它是一个实现细节,您不应该关心它。

§20.8.9 [func.bind]

template<class F, class... BoundArgs>
unspecifiedbind(F&&, BoundArgs&&...);

§20.8.10 [func.memfn]

template<class R, class T>
unspecifiedmem_fn(R T::* pm);

“解决方法”:使用模板。

template<class F>
std::function<void(sp_session*)> test(F handler)
{
    return ...;
}
于 2012-10-06T15:16:28.247 回答
1

std::mem_fn不是您要查找的类型。
您需要的类型是std::function将实例作为参数:

std::function<void(sp_session*)> test(std::function<void(MainWindow *)> handler)

它可以绑定到成员函数,并且仅与实例一起用作第一个参数。
如果在原始函数中你会这样做:

instance->*handler();

在新功能中,您可以:

handler(instance);
于 2012-10-06T16:38:16.843 回答