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<bool(int)> func = [](int i) { return i % 2 == 0; }; set<int> myNewSet = filter(mySet, func);
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中文网其他相关文章!