什么是std :: mem_fn类型等效于void(MainWindow :: * handler)()?

时间:2012-10-06 15:12:10

标签: c++ c++11

我有一个功能:

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

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

2 个答案:

答案 0 :(得分:4)

C ++ 11活页夹系列函数(mem_fnbind)返回的确切类型是未指定,这意味着它是一个实现细节,你不应该关注它。

§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);