確定Lambda 的參數和返回類型
給定一個lambda,可以使用編譯來提取其參數類型和返回類型-時間技巧。這可以透過使用 lambda 特徵來實現,它提供了一種在編譯時存取有關 lambda 的資訊的方法。
要定義 lambda 特徵,我們可以利用 decltype 運算子來檢查 lambda 運算子的簽章( )。透過專門針對該類型的模板,我們可以檢索參數和傳回類型。
例如,以下程式碼實現lambda 特徵:
template<typename T> struct lambda_traits : public lambda_traits<decltype(&T::operator())> { }; template<typename ReturnType, typename... Args> struct lambda_traits<ReturnType(Args...)> { using param_type = Args...; using return_type = ReturnType; };
利用這些特徵,我們可以擷取lambda 的參數和回傳類型如下:
auto lambda = [](int i) { return long(i * 10); }; lambda_traits<decltype(lambda)>::param_type i; // i should be int lambda_traits<decltype(lambda)>::return_type l; // l should be long
這種方法允許我們從lambda 動態建構std::function對象,如圖所示在以下程式碼中:
template<typename TLambda> void f(TLambda lambda) { typedef typename lambda_traits<TLambda>::param_type P; typedef typename lambda_traits<TLambda>::return_type R; std::function<R(P)> fun = lambda; // Construct the std::function object }
請注意,由於無法在編譯時確定確切的類型,因此這種方法對於通用lambda 而言會失敗,例如[](auto x ) {}。
以上是如何在編譯時確定 C Lambda 的參數和回傳類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!