首页 > 后端开发 > C++ > 如何使用模板有效地将通用 C Lambda 转换为 std::function?

如何使用模板有效地将通用 C Lambda 转换为 std::function?

Linda Hamilton
发布: 2024-12-09 11:03:08
原创
801 人浏览过

How Can I Efficiently Convert a Generic C   Lambda to an std::function Using Templates?

使用模板将 Lambda 转换为 std::function

在 C 中,使用模板将 lambda 函数转换为 std::function 可以是一项具有挑战性的任务。为了实现这一点,模板类型推导是必不可少的,但在某些情况下它可能会面临限制。

最初,尝试将 lambda 转换为 std::function 可能会由于缺少模板参数或候选匹配不匹配而失败。要解决此问题,请显式指定模板参数,如 std::function 中所示。 f([]) 就足够了。但是,对于针对任何参数类型和计数的 lambda 的通用代码来说,这种方法并不可取。

要解决此问题,需要更细致的解决方案。虽然模板类型推导无法直接从 lambda 推断出 std::function 模板参数,但仍然可以通过提供额外的类型约束来引导。

考虑以下方法:将 lambda 函数包装在结构体恒等中

template <typename T>
struct identity
{
  typedef T type;
};

template <typename... T>
void func(typename identity<std::function<void(T...)>>::type f, T... values) {
  f(values...);
}
登录后复制
std::function>,其中 T 可以从 lambda 参数推导出来。这个结构体充当身份类型,允许 lambda 作为参数传递,无需任何类型转换。

int main() {
  func([](int x, int y, int z) { std::cout << (x*y*z) << std::endl; }, 3, 6, 8);
  return 0;
}
登录后复制
现在,当调用 func 时,std::function 的模板参数可以从身份结构。这消除了显式模板参数规范或额外参数传递的需要。

这种方法满足将泛型 lambda 转换为 std::function 的要求,无需显式指定模板参数,并允许对可变参数进行柯里化通过保留原始 lambda 签名来运行函数。

以上是如何使用模板有效地将通用 C Lambda 转换为 std::function?的详细内容。更多信息请关注PHP中文网其他相关文章!

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