2014-07-04 2 views
2

람다 식에서는 C++ 11에서 클로저의 유용성을 얻지 못했습니다.람다 클로저 대 간단한 인자?

auto f = [] (int n, int m) { return n + m }; 
std::cout << f(2,2); 

대.

int n = 2; 
auto f = [n] (int m) { return n + m }; 
std::cout << f(2); 

이것은 매우 기본적이고 기본적인 예입니다. 클로저가 다른 종류의 문장에서 중요한 부분을 담당한다고 생각하지만 C++ 책은 이것을 명확히하지 않습니다 (지금까지).

클로저를 매개 변수로 포함하지 않는 이유는 무엇입니까?

+8

가끔은 하나의 매개 변수 만있는 뭔가가 필요하기 때문에. – juanchopanza

+0

@juanchopanza 간단한 예는 좋은 친구가 될 것입니다. – user3407764

+0

@ user3407764 예를 들어, 표준 라이브러리 알고리즘은 특정 수의 매개 변수를 필요로합니다 (정확한 수는 알고리즘에 따라 다릅니다. :'std :: generate'는 매개 변수를 필요로하지 않는 것을 기대하고,'std :: find_if'는 무언가를 기대합니다) 그 중 하나를 취하는 등). –

답변

4

확인, 간단한 예제는 문자열

char x = 'x'; 
std::string s = "Text to remove all 'x's from"; 
s.erase(std::remove_if(s.begin(), s.end(), [x](char c) {return x == c;}), s.end()); 

빌려이 예에서 http://en.cppreference.com/w/cpp/algorithm/remove

에서 약간 변형의 모든 X 년대를 제거 remove_if()은 하나의 매개 변수를 사용합니다,하지만 난에 대한 두 개의 값이 필요합니다 비교.

1

클로저가 항상 즉시 호출되는 것은 아닙니다. 그것들은 나중에 람다 함수를 성공적으로 수행하는 데 필요한 데이터가 더 이상 범위 내에 없거나 콜 사이트에서 쉽게 액세스 할 수있을 때 나중에 저장하고 호출 할 수있는 객체입니다.

클로저와 함께 필요한 모든 데이터를 저장할 수 있지만 클로저가 생성 될 때 필요한 모든 것을 가져 와서 결국 호출 될 때 사용하는 것이 훨씬 간단합니다. 캡슐화의 형태를 제공합니다.

이렇게하면 코드 결합이 줄어 듭니다. 코드와 함께 데이터를 저장하면 호출자는 저장하기로 결정한 특정 객체에만 작업 할 수 있기 때문입니다. 클로저는 자체 데이터를 함께 전달하므로 필요한 모든 데이터를 처리 할 수 ​​있습니다.

다음은 매우 단순화 된 실제 사례입니다. 여러 값으로 필드를 지원해야하는 데이터베이스 서버를 구축했습니다. 문제는 결과가 표시 될 때 실제로 어떤 값으로 인해 레코드가 검색 조건과 일치하는지 강조하는 것이 중요하다는 것입니다. 따라서 쿼리 파서는 일치하는 값인지 아닌지를 나타내는 클로저 형식의 조건자를 출력합니다. 폐쇄는 모음에 저장있어

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); 
    } 
} 
+0

코드를 이해하고 코드로 무엇을하고 싶었는지 약간의 시간을 들여야했지만, 일단이 대답을 얻은 후에는 정말 훌륭했습니다. 아주 좋습니다 감사 해요! – user3407764