2014-05-22 69 views
4

我見過這樣的代碼:拉姆達的類型是什麼?

std::sort(x, x + N, 
    // Lambda expression begins 
    [](float a, float b) { 
     return std::abs(a) < std::abs(b); 
    }); 

明顯的std::sort的第三個參數是一個可以容納拉姆達一個類型。但那是什麼類型? std::sort是如此嚴重超載,我無法破譯它。我想構建一個函數列表:我想使用lambda表達式而不是函數指針,因爲後者必須具有大致相同的參數列表。

我想我可以寫

auto letTheComplerSortOutTheType = 
     [](float a, float b) { 
      return std::abs(a) < std::abs(b); 
     }); 

但是當涉及到使用的容器,不會幫我。

+2

您可以隨時嘗試打印它; 'std :: cout << typeid(foo).name();' – OMGtechy

+0

如果你在調試器中運行它並查看,你會看到編譯器爲該類型選擇的一些亂碼。每個lambda都是一個新的獨特類型。 – David

回答

6

lambda的類型是編譯器已知的唯一。在你的代碼中,std::sort是一個函數模板,其第三個參數是模板參數,由編譯器推導出,用於傳遞給該函數的lambda表達式。

通常你不會需要知道拉姆達的類型,因爲它是由編譯器爲您定義,像下面:

//generated by the compiler 
struct __unique_lambda_defined_by_compiler //arbitrary ugly name! 
{ 
     bool operator()(float a, float b) const { 
       return std::abs(a) < std::abs(b); 
     } 
}; 

所以,你的代碼轉換爲這樣的:

//translated by the compiler 
std::sort(x, x + N, __unique_lambda_defined_by_compiler()); 

請注意,如果你想擁有的拉姆達(和函數指針!)的容器,那麼你可以使用std::function抹去的類型的lambda(和函數指針),如下所示:

std::vector<std::function<bool(int,int)>> callbacks; 

callbacks.push_back([](int, int) { ... }); //the lambda must return bool 
callbacks.push_back([](int, int) { ... }); 
callbacks.push_back([](int, int) { ... }); 

bool compare(int,int) { ... } 

callbacks.push_back(compare); //store normal function as well! 
+0

啊。非常有意義。這解釋了所有這些*有趣的數字*當我將鼠標懸停在lambda類型上時! –

+1

加上:如果你想把它放在一個容器中,知道lambda可以綁定到什麼類型是很有用的。所以在你的情況下,你可以(可能)使用一個向量>。所以最後你真的不需要知道確切的類型。 – dsu