람다 함수의 유형 추론 함정
C에서 유형 추론은 컴파일러가 변수의 유형을 추론하고 표현. 그러나 람다 함수 및 std::function 객체를 처리할 때 문제가 발생할 수 있습니다.
다음 함수 템플릿을 고려하세요.
template<class A> set<A> filter(const set<A>& input, function<bool(A)> compare) { // Implementation omitted }
이 함수를 람다 함수와 함께 호출하는 경우
filter(mySet, [](int i) { return i % 2 == 0; });
호출에 일치하는 함수가 없다는 오류가 발생할 수 있습니다. 이는 유형 추론이 std::function에 대한 직접적인 인수로 람다 함수를 처리할 수 없기 때문에 발생합니다.
그 이유는 람다 함수는 엄밀한 의미에서 함수로 간주되지 않고 특정 속성을 가진 함수 객체로 간주되기 때문입니다. 특성 세트. 표준에서는 람다를 명시적인 매개변수 유형 및 경우에 따라 함수 포인터를 사용하여 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); });
이러한 전략을 사용하면 C의 유형 추론 제한을 고려하면서 람다 함수와 std::function 객체를 성공적으로 활용할 수 있습니다. .
위 내용은 C 함수 템플릿의 Lambda 함수에서 유형 추론이 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!