我正在嘗試將型別引數傳遞給 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,如何實作它?
uj5u.com熱心網友回復:
有多種方式:
- 讓編譯器使用 decltype() 推斷 lamabda 的型別。但是您需要記住一件事:在 C 20 之前,lambda 型別沒有默認建構式。從 C 20 開始,無狀態 lambda(沒有捕獲的 lambda)有一個默認建構式,但有狀態 lambda(即,有捕獲的 lambda)沒有默認建構式(這在 cppreference.om 上有檔案)。為什么默認建構式在這里很重要?答案是如果存在默認建構式,在您的 priority_queue 示例中,一旦指定了 lambda 型別,您就不必將 cmp 引數傳遞給建構式。由于默認建構式僅存在于 C 20 以來的無狀態 lambda,因此您最好將 cmp 引數顯式傳遞給建構式:
auto cmp = [](int x, int y){return x>y;};
priority_queue<int, vector<int>, decltype(cmp)> q(cmp);
- 使用
<functional>
標頭顯式指定 lambda 型別:
#include <functional>
...
priority_queue<int, vector<int>, function<bool(int, int)>> q(cmp);
- 使用函式物件類。在這種情況下,您只需將函式物件類指定為模板型別引數,而無需將 cmp 引數傳遞給建構式,因為您自己定義的函式物件類有一個默認的(合成的)建構式。
struct Cmp {
bool operator()(int x, int y) {return x > y;}
};
priority_queue<int, vector<int>, Cmp> q;
- 盡可能使用庫定義的函式物件。
priority_queue<int, vector<int>, std::greater<int>> q;
uj5u.com熱心網友回復:
我洗掉了最后')'
一個
decltype([](int x, int y){return x>y;}))
decltype([](int x, int y){return x>y;})
它編譯成功。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/494099.html