2014-10-17 41 views
1

我想打電話給lambda表達式在C++給人一種功能的其他功能

template <typename FUNC> 
int execute (FUNC) 
{ 
    int a { 5 }; 
    int b { 8 }; 
    return FUNC (a, b); 
} 

與以下行:

std::cout << execute ([] (int a, int b){ return a + b; }) << std::endl; 

,出現以下錯誤:

error C2661: 'main::<lambda_5994edd6ba73caf12c83e036d510d0d8>::<lambda_5994edd6ba73caf12c83e036d510d0d8>': Keine überladene Funktion akzeptiert 2 Argumente 

所以問題是我做錯了什麼?錯誤是德語,但它基本上只是說,該功能不需要2個參數,它顯然應該做

+0

FUNC是不是在這方面發揮有效的論據。每一個參數(在這個上下文中)都必須包含類型名稱和變量名稱(如果你想引用它,你想要99%的時間)。只要讓你的函數接受'std :: function '你就可以去 – Creris 2014-10-17 14:56:16

回答

6

不,這不是你應該如何調用該功能。你沒有指定參數的名字。你試圖做的是將這個類型作爲一個函數。

修正模板函數是:

template <typename FUNC> 
int execute (FUNC f) 
{ 
    int a { 5 }; 
    int b { 8 }; 
    return f(a, b); 
} 
2

你不是實際調用函數...你構建FUNC類型的對象,並返回它,FUNC是無法轉換爲int。你的意思是:

template <typename FUNC> 
int execute (FUNC&& f) 
{ 
    int a { 5 }; 
    int b { 8 }; 
    return f(a, b); 
} 

或可替換地(原來寫「更好」,但壞詞的選擇):

int execute(std::function<int(int, int)> f) 
{ 
    int a { 5 }; 
    int b { 8 }; 
    return f(a, b); 
}   
+2

爲什麼你認爲'std :: function'比模板參數好? 'std :: function'具有構造開銷和類型擦除開銷。 – Angew 2014-10-17 15:05:23

+0

更好的可能是錯誤的詞。有些情況下,類型擦除是一件好事,我想表明這是一個可能的解決方案。 – Barry 2014-10-17 15:06:57

+1

更好;-)有+1 – Angew 2014-10-17 15:08:06