2012-10-06 60 views
1

我有一个函数:相当于void(MainWindow :: * handler)()的std :: mem_fn类型是什么?

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

所以我不知道我做错了什么。

+0

'mem_fn'是一个函数,而不是一个类型,你可以在此使用办法。 – Philipp

回答

1

std::mem_fn不是您正在寻找的类型。
您所需要的类型是std::function,是以实例作为论据:

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

它可以绑定到成员函数,并刚刚与实例作为第一个参数使用。
如果在原有的功能,你会怎么做:

instance->*handler(); 

在新功能你这样做:

handler(instance); 
+0

嗯好。我想知道mem_fn是什么。 – ljbade

+0

@Leith:'mem_fn'是一个活页夹函数,它允许你将一个成员指针转换成一个函数对象,然后可以通过'std :: function'来存储它。这是'std :: bind(&T :: member,_1,_2,_3,...)'的简写形式,只是你不需要知道你有多少个参数。使用'mem_fn',它只是'std :: mem_fn(&T :: member)'。 – Xeo

4

通过功能的C++ 11的粘合剂系列(mem_fnbind)返回的确切类型是不确定,这意味着它是一个实现细节,你不应该用它关心自己。

§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 ...; 
} 
相关问题