簡體   English   中英

C++11:如何使用 lambda 作為類型參數,它需要像 std::less/std::greater 這樣的“函子類型”?

[英]C++11: how to use lambda as type parameter, where it requires a "functor type" like std::less/std::greater?

我正在嘗試將類型參數傳遞給 priority_queue,就像 std::less 或 std::greater 一樣,如下所示:

priority_queue<int, vector<int>, [](int x, int y){return x>y;})> q;

它沒有編譯,然后我添加了decltype ,仍然失敗:

priority_queue<int, vector<int>, decltype([](int x, int y){return x>y;}))> q;

問題是,我們可以在這種情況下使用 lambda,如何實現它?

有多種方式:

  1. 讓編譯器使用decltype(lambda)推斷 lamabda 的類型。 但是您需要記住一件事:在 C++20 之前,lambda 類型沒有默認構造函數。 從 C++20 開始,只有無狀態 lambda (沒有捕獲的 lambda)有默認構造函數,而有狀態 lambda (即,有捕獲的 lambda)沒有默認構造函數(這在 cppreference.com 上有明確記錄)。 為什么默認構造函數在這里很重要? 答案是,如果存在默認構造函數,則不必將比較函數 (cmp) 傳遞給 priority_queue 構造函數,只要將 lambda 類型指定為模板參數即可。 由於默認構造函數僅適用於從 C++20 開始的無狀態 lambda,因此您最好將 cmp 參數顯式傳遞給構造函數:
auto cmp = [](int x, int y){return x>y;}; 
priority_queue<int, vector<int>, decltype(cmp)> q(cmp);
  1. 使用<functional>標頭顯式指定 lambda 類型:
#include <functional>
...
priority_queue<int, vector<int>, function<bool(int, int)>> q(cmp);
  1. 使用函數對象類。 在這種情況下,您只需要將函數對象類指定為模板類型參數,而無需將 cmp 參數傳遞給構造函數,因為您自己定義的函數對象類有一個默認的(合成的)構造函數.
struct Cmp {
    bool operator()(int x, int y) {return x > y;}
};
priority_queue<int, vector<int>, Cmp> q;
  1. 盡可能使用庫定義的函數對象。
priority_queue<int, vector<int>, std::greater<int>> q;

')'

decltype([](int x, int y){return x>y;}))

decltype([](int x, int y){return x>y;})

它編譯成功。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM