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

为什么'filter()”中的 Lambda 函数的 C 11 模板类型推导失败?

DDD
发布: 2024-12-17 11:22:25
原创
893 人浏览过

Why Does C  11 Template Type Deduction Fail with Lambda Functions in `filter()`?

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

C 11 允许模板类型推导,但在 lambda 函数或 std 时存在限制: : 涉及到函数。当使用带有模板参数的函数时,编译器通常可以从参数类型推断出模板类型。但是,当直接在参数中使用 lambda 时,此推导会失败。

问题陈述

以下代码无法推导函数 filter() 的模板类型:

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

当使用 lambda 函数作为比较参数直接调用此函数时,编译器会引发错误:

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

错误原因

此错误的根本原因在于 lambda 函数的本质。虽然它们的行为类似于函数对象,但它们并不是真正的函数。 Lambda 函数不会隐式转换为 std::function 对象,这将允许编译器推断类型。

解决方法

存在多种解决方法来解决推导问题:

1。显式模板参数:

显式指定模板参数:

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

2.创建一个 std::function 对象:

将 lambda 函数转换为 std::function 对象并将其作为参数传递:

std::function<bool(int)> compare = [](int i) { return i % 2 == 0; };
filter(mySet, compare);
登录后复制

3.使用替代函数定义:

重新定义 filter() 函数以接受通用比较函数对象:

template<class Value, class CompareType>
set<Value> filter(const set<Value>& input, CompareType compare) {
    // ...
}
登录后复制

现在,可以直接使用 lambda 函数调用该函数:

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

结论

Lambda函数提供了一种定义短期函数的便捷方法,但它们可能会引入模板类型推导的复杂性。通过了解限制并使用适当的解决方法,开发人员可以有效地利用 C 11 代码中的 lambda。

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

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