首页 > 后端开发 > C++ > 如何检索 C 中 Lambda 表达式的参数和返回类型?

如何检索 C 中 Lambda 表达式的参数和返回类型?

Patricia Arquette
发布: 2024-12-22 17:47:10
原创
877 人浏览过

How Can I Retrieve the Parameter and Return Types of a Lambda Expression in C  ?

检索 Lambda 的参数和返回类型

在 lambda 表达式中,确定参数和返回类型对于接受 lambda 作为参数的函数至关重要。让我们探讨一下这个任务的可行性以及实现它的方法。

Lambda Traits

为了获取 lambda 的参数和返回类型,建议定义可以按如下方式使用的 lambda_traits 模板:

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_traits,函数可以内省作为参数接收的 lambda 的参数和返回类型,启用高级功能,例如:

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; //I want to do this!
   //...
}
登录后复制

使用 decltype 内省参数类型

幸运的是,可以检索使用 lambda 运算符 () 的 decltype 的参数类型。此技术在以下 function_traits 实现中得到了优雅的演示:

template <typename T>
struct function_traits
    : public function_traits<decltype(&amp;T::operator())>
{};
登录后复制

对于通用 lambda,function_traits 直接使用其operator() 的签名。对于成员函数指针,它专门提供了 arity、result_type 和参数类型。

示例用法

考虑以下示例:

int main()
{
    auto lambda = [](int i) { return long(i*10); };

    typedef function_traits<decltype(lambda)> traits;

    static_assert(std::is_same<long, traits::result_type>::value, "err");
    static_assert(std::is_same<int, traits::arg<0>::type>::value, "err");

    return 0;
}
登录后复制

此示例说明如何利用 function_traits 来验证 lambda 的预期参数和返回类型。请注意,此方法可能不适用于像 [](auto x) {} 这样的通用 lambda。

以上是如何检索 C 中 Lambda 表达式的参数和返回类型?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板