>백엔드 개발 >C++ >함수 템플릿과 함께 Lambda 함수를 사용할 때 C 11이 유형을 추론하지 못하는 이유는 무엇입니까?

함수 템플릿과 함께 Lambda 함수를 사용할 때 C 11이 유형을 추론하지 못하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-17 21:04:10467검색

Why Doesn't C  11 Deduce Types When Using Lambda Functions with Function Templates?

C 11은 함수 또는 람다 함수가 포함될 때 유형을 추론하지 않습니다

C 11 템플릿 또는 람다 함수를 사용할 때 유형 추론이 작동하는 방식을 이해하는 것이 중요합니다. std::function 또는 람다 함수를 허용하는 함수 템플릿을 정의하는 경우 컴파일러는 템플릿 유형을 자동으로 추론하지 못할 수도 있습니다.

예를 들어 다음 함수를 고려하세요.

template<class A>
set<A> filter(const set<A>& input, function<bool(A)> compare) {
    set<A> ret;
    for(auto it = input.begin(); it != input.end(); it++) {
        if(compare(*it)) {
            ret.insert(*it);
        }
    }
    return ret;
}

이 함수를 람다 함수로 직접 호출하려고 하면 오류가 발생할 수 있습니다. 이는 컴파일러가 람다 함수만으로는 템플릿 유형을 추론할 수 없기 때문입니다.

set<int> myNewSet = filter(mySet,[](int i) { return i%2==0; });

이 오류는 템플릿 유형을 명시적으로 지정하여 피할 수 있습니다.

set<int> myNewSet = filter<int>(mySet,[](int i) { return i%2==0; });

또는 다음을 수행할 수 있습니다. 람다 함수를 std::function 객체로 변환합니다:

std::function<bool(int)> func = [](int i) { return i%2 ==0; };
set<int> myNewSet = filter(mySet,func);

세트를 필터링해야 하는 경우 비교 함수를 기반으로 하는 값의 경우 CompareFunction 유형을 허용하는 함수 템플릿을 생성하여 보다 일반적인 솔루션을 제공할 수 있습니다.

template<class Value,class CompareFunction>
set<Value> filter(const set<Value>& input,CompareFunction compare) {
    set<Value> ret;
    for(auto it = input.begin(); it != input.end(); it++) {
        if(compare(*it)) {
            ret.insert(*it);
        }
    }
    return ret;
}

위 내용은 함수 템플릿과 함께 Lambda 함수를 사용할 때 C 11이 유형을 추론하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.