首页 > 后端开发 > C++ > 为什么在函数模板中使用 Lambda 时 C 11 类型推导会失败?

为什么在函数模板中使用 Lambda 时 C 11 类型推导会失败?

Patricia Arquette
发布: 2025-01-04 09:00:35
原创
513 人浏览过

Why Does C  11 Type Deduction Fail with Lambdas in Function Templates?

C 11 Lambda 函数的类型推导限制

在 C 11 中使用 lambda 函数和 std::function 时,类型推导可能不会按预期执行,导致错误。

问题

考虑以下函数模板:

template<class A>
set<A> filter(const set<A>& input, function<bool(A)> compare);
登录后复制

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

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

将出现错误由于编译器无法推断模板类型而发生A.

说明

Lamda 函数虽然为匿名函数提供了方便的语法,但它们是实现operator() 方法的不同类型。它们不受类型推导的直接支持,类型推导需要精确的类型。

解决方案

存在几种解决方法来解决此问题:

  • 明确提供模板类型:
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
登录后复制
  • **创建一个 std::function:
std::function<bool(int)> func = [](int i) { return i % 2 == 0; };
set<int> myNewSet = filter(mySet, func);
登录后复制
  • 使用修改后的功能template:
template<class A, class CompareFunction>
set<A> filter(const set<A>& input, CompareFunction compare);
登录后复制

在此修改后的模板中,CompareFunction 类型表示采用 A 参数并返回布尔值的函数对象。模板参数不再推导,而是显式指定。

附加功能

使用新的 decltype 关键字和函数返回类型语法,函数可以进一步泛化为自动判断返回类型:

template<class Value, class CompareType, class IndexType>
auto filter(const set<Value>& input, CompareType compare, IndexType index) -> map<decltype(index(*(input.begin()))), Value> { ... }
登录后复制

此模板函数需要三种类型:输入设定值类型、比较函数类型和索引函数类型。返回类型自动确定并实例化。

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

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