首页 >后端开发 >C++ >如何在编译时确定 C Lambda 的参数和返回类型?

如何在编译时确定 C Lambda 的参数和返回类型?

Linda Hamilton
Linda Hamilton原创
2024-12-25 17:53:11685浏览

How Can I Determine the Parameter and Return Types of a C   Lambda at Compile Time?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn