![](/img/trans.png)
[英]C++11: return_type (for std::bind) of functor where return type is based on input type
[英]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,如何實現它?
有多種方式:
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);
<functional>
標頭顯式指定 lambda 類型:#include <functional>
...
priority_queue<int, vector<int>, function<bool(int, int)>> q(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;
')'
從
decltype([](int x, int y){return x>y;}))
decltype([](int x, int y){return x>y;})
它編譯成功。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.