确定 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中文网其他相关文章!