鑑於lambda表達式具有以下結構:過載模板拉姆達不知道的參數類型用於非模板化參數
auto lambda_1 = [](int x, auto p) -> void {...};
auto lambda_2 = [](float x, auto p) -> int {...};
我想提取的x
類型,以及返回類型,給定一個已知類型p
。
返回類型是相當簡單的,只要x
是默認constructible(我可以做一個需求沒有問題):
template<typename CB_T>
void foo(CB_T cb) {
using res_type = decltype(cb({}, std::declval<KnownP>()));
}
同樣,如果第二個參數沒有infered,我可以很容易使用類似function_traits的東西找到第一個參數的類型。
我知道我可以按照我想要的方式觸發重載分辨率,如我在不知道x
的類型是什麼類型的情況下提取結果類型的證據,所以我沒有看到爲什麼我不應該拉這個關閉。
感覺就像我有拼圖的每一塊,但我似乎無法計算出如何獲取該場景中的重載函數的類型,以便提取x
的類型。
有什麼建議嗎?
你試圖解決的實際問題是什麼?一般來說,這是不可能的,沒有反思。對於沒有SFINAE shenanig的'[](T,auto)'形式的*特別* lambdas,這是可能的,但是這看起來很奇怪。 – Barry
@Barry它是... ...錯綜複雜的...我需要這個爲了分配一個臨時緩衝區來傳遞一個模板子進程的引用,以便在調用lambda之前進行填充。我需要第二個參數是模板化的,因爲實際類型會非常不透明,我真的不想強加給用戶(我也希望lambda可以用不同的不透明類型重用)。 [參考](https://github.com/FrancoisChabot/abulafia/issues/15) – Frank
@Barry我真的希望能夠接受任意的函數而不是隻是lambda,但要求用戶在lambdas中包裝函子是可以接受的必要。 (雖然我真的想支持閉包) – Frank