클로저가 항상 즉시 호출되는 것은 아닙니다. 그것들은 나중에 람다 함수를 성공적으로 수행하는 데 필요한 데이터가 더 이상 범위 내에 없거나 콜 사이트에서 쉽게 액세스 할 수있을 때 나중에 저장하고 호출 할 수있는 객체입니다.
클로저와 함께 필요한 모든 데이터를 저장할 수 있지만 클로저가 생성 될 때 필요한 모든 것을 가져 와서 결국 호출 될 때 사용하는 것이 훨씬 간단합니다. 캡슐화의 형태를 제공합니다.
이렇게하면 코드 결합이 줄어 듭니다. 코드와 함께 데이터를 저장하면 호출자는 저장하기로 결정한 특정 객체에만 작업 할 수 있기 때문입니다. 클로저는 자체 데이터를 함께 전달하므로 필요한 모든 데이터를 처리 할 수 있습니다.
다음은 매우 단순화 된 실제 사례입니다. 여러 값으로 필드를 지원해야하는 데이터베이스 서버를 구축했습니다. 문제는 결과가 표시 될 때 실제로 어떤 값으로 인해 레코드가 검색 조건과 일치하는지 강조하는 것이 중요하다는 것입니다. 따라서 쿼리 파서는 일치하는 값인지 아닌지를 나타내는 클로저 형식의 조건자를 출력합니다. 폐쇄는 모음에 저장있어
std::function< bool(int value) > parser::match_int(int search_val) {
return [=](int value) { value == search_val; };
}
그건 :
그것은 같은 것을 보았다. 기록을 렌더링 할 때가 되었기 때문에 강조해야 할 값을 쉽게 결정할 수있었습니다. 파서 및 관련 데이터는 이제 사라졌습니다.
void render_values(std::function< bool(int value) > pred, std::vector<int> values) {
for (int value : values) {
if (pred(value))
render_highlight(value);
else
render_normal(value);
}
}
가끔은 하나의 매개 변수 만있는 뭔가가 필요하기 때문에. – juanchopanza
@juanchopanza 간단한 예는 좋은 친구가 될 것입니다. – user3407764
@ user3407764 예를 들어, 표준 라이브러리 알고리즘은 특정 수의 매개 변수를 필요로합니다 (정확한 수는 알고리즘에 따라 다릅니다. :'std :: generate'는 매개 변수를 필요로하지 않는 것을 기대하고,'std :: find_if'는 무언가를 기대합니다) 그 중 하나를 취하는 등). –