2012-10-06 34 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 ...; 
} 
相關問題