Lambda 函数的类型推导陷阱
在 C 中,类型推导是一个强大的功能,它允许编译器推断变量的类型并表达式。但是,在处理 lambda 函数和 std::function 对象时,它可能会遇到挑战。
考虑以下函数模板:
template<class A> set<A> filter(const set<A>& 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 相同的水平。
要规避此限制,您可以采取多种方法:
std::function<bool(int)> func = [](int i) { return i % 2 == 0; }; set<int> myNewSet = filter(mySet, func);
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
template<class A, class CompareFunction> set<A> filter(const set<A>& input, CompareFunction compare) { // Implementation omitted } set<int> result = filter(myIntSet, [](int i) { i % 2 == 0; });
template<class Value, class CompareType, class IndexType> auto filter(const set<Value>& 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中文网其他相关文章!