首页 > 后端开发 > C++ > 为什么 C 函数模板中的 Lambda 函数类型推导失败?

为什么 C 函数模板中的 Lambda 函数类型推导失败?

Patricia Arquette
发布: 2025-01-01 03:43:09
原创
700 人浏览过

Why Does Type Deduction Fail with Lambda Functions in C   Function Templates?

Lambda 函数的类型推导陷阱

在 C 中,类型推导是一个强大的功能,它允许编译器推断变量的类型并表达式。但是,在处理 lambda 函数和 std::function 对象时,它可能会遇到挑战。

考虑以下函数模板:

template<class A>
set<A> filter(const set<A>&amp; input, function<bool(A)> compare) {
    // Implementation omitted
}
登录后复制

使用 lambda 函数调用此函数时直接调用,如:

filter(mySet, [](int i) { return i % 2 == 0; });
登录后复制

您可能会遇到错误,指出调用没有匹配的函数。出现这种情况是因为类型推导无法将 lambda 函数作为 std::function 的直接参数处理。

原因是 lambda 函数不被视为严格意义上的函数,而是具有特定含义的函数对象。一组特征。该标准允许将 lambda 转换为具有显式参数类型的 std::function 对象,在某些情况下还可以转换为函数指针。然而,这并没有将它们提升到与 std::function 相同的水平。

要规避此限制,您可以采取多种方法:

  1. 将函数的 Lambda对象:
std::function<bool(int)> func = [](int i) { return i % 2 == 0; };
set<int> myNewSet = filter(mySet, func);
登录后复制
  1. 显式提供模板类型参数:
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
登录后复制
  1. 使用模板类:
template<class A, class CompareFunction>
set<A> filter(const set<A>&amp; input, CompareFunction compare) {
    // Implementation omitted
}

set<int> result = filter(myIntSet, [](int i) { i % 2 == 0; });
登录后复制
  1. 利用 Dectype 和函数类型语法:
template<class Value, class CompareType, class IndexType>
auto filter(const set<Value>&amp; input, CompareType compare, IndexType index) -> map<decltype(index(*(input.begin()))), Value> {
    // Implementation omitted
}

map<string, int> s = filter(myIntSet, [](int i) { return i % 2 == 0; }, [](int i) { return toString(i); });
登录后复制

通过采用这些策略,您可以成功地利用 lambda 函数和 std::function 对象,同时考虑 C 的类型推导限制.

以上是为什么 C 函数模板中的 Lambda 函数类型推导失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

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