检索 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(&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中文网其他相关文章!