> 백엔드 개발 > C++ > C 함수 템플릿의 Lambda 함수에서 유형 추론이 실패하는 이유는 무엇입니까?

C 함수 템플릿의 Lambda 함수에서 유형 추론이 실패하는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2025-01-01 03:43:09
원래의
697명이 탐색했습니다.

Why Does Type Deduction Fail with Lambda Functions in C   Function Templates?

람다 함수의 유형 추론 함정

C에서 유형 추론은 컴파일러가 변수의 유형을 추론하고 표현. 그러나 람다 함수 및 std::function 객체를 처리할 때 문제가 발생할 수 있습니다.

다음 함수 템플릿을 고려하세요.

template<class A>
set<A> filter(const set<A>&amp; input, function<bool(A)> compare) {
    // Implementation omitted
}
로그인 후 복사

이 함수를 람다 함수와 함께 호출하는 경우

filter(mySet, [](int i) { return i % 2 == 0; });
로그인 후 복사

호출에 일치하는 함수가 없다는 오류가 발생할 수 있습니다. 이는 유형 추론이 std::function에 대한 직접적인 인수로 람다 함수를 처리할 수 없기 때문에 발생합니다.

그 이유는 람다 함수는 엄밀한 의미에서 함수로 간주되지 않고 특정 속성을 가진 함수 객체로 간주되기 때문입니다. 특성 세트. 표준에서는 람다를 명시적인 매개변수 유형 및 경우에 따라 함수 포인터를 사용하여 std::function 객체로 변환할 수 있습니다. 그러나 이것이 std::function과 동일한 수준으로 향상되지는 않습니다.

이 제한을 우회하기 위해 취할 수 있는 몇 가지 접근 방식이 있습니다.

  1. 람다에서 함수로 개체:
std::function<bool(int)> func = [](int i) { return i % 2 == 0; };
set<int> myNewSet = filter(mySet, func);
로그인 후 복사
  1. 템플릿 유형 인수를 명시적으로 제공:
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
로그인 후 복사
  1. 템플릿 사용 클래스:
template<class A, class CompareFunction>
set<A> filter(const set<A>&amp; input, CompareFunction compare) {
    // Implementation omitted
}

set<int> result = filter(myIntSet, [](int i) { i % 2 == 0; });
로그인 후 복사
  1. Dectype 및 함수 유형 구문 활용:
template<class Value, class CompareType, class IndexType>
auto filter(const set<Value>&amp; 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿