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 중국어 웹사이트의 기타 관련 기사를 참조하세요!