2013-04-15 2 views
1

초보자입니다.하지만 펑터의 차이점을 살펴보면 값을 내부에 저장하고 건설에서이 값을 초기화 할 수 있다는 점이 다릅니다. 함수 호출에서 전체 인수를 취하는 점을 제외하면 일반 함수도 동일한 방식으로 작동합니다. 아마도 나는 어떤면에서 틀렸지 만, 일반 함수와 관련하여 펑터의 트릭과 이점은 어디에 있습니까?일반 함수와 비교할 때 펑터가 값을 인수로 취하는 것에 비해

+3

사과와 과일의 구분은 무엇입니까? – PlasmaHH

답변

3

핵심 차이점은 함수 작성자가 함수가 아닌 형식을 정의한다는 것입니다. 상태없는 펑터 (첨부 된 데이터가없는)조차도 이것을 활용할 수 있습니다. 예를 들어, 정렬 알고리즘 내부 std::less의 사용을 고려하십시오 sort(v.begin(), v.end(), std::less<int>());

template <typename Iterator, typename Comparator> 
sort(Iterator begin, Iterator end, Comparator c) { 
... 
    if (c(*begin,*end)) { ... 
... 
} 

를 호출합니다. 함수가 호출되면 std::less<int>의 인스턴스가 만들어져 템플릿으로 전달됩니다. 상태 비 저장이므로 함수를 전달하는 비용은 거의 없습니다. 함수 내에서 c(a,b) 호출은 c.operator()(a,b)에 대한 호출로 확인되며 컴파일러는 형식을 알고 있습니다. 호출을 효율적으로 인라인 (이 경우 간단 함)하고 단일 비교 명령으로 대체 할 수 있습니다.

한편, 동등한 C 함수 qsort은 함수 포인터를 사용합니다 (값으로 함수를 전달할 수 없음). 내부에 qsort, 컴파일러는 호출 된 함수가 무엇인지 모르고 인라인 할 수 없으므로 각 비교에 대해 함수 호출을 수행해야합니다.

펑터는 나중에 호출 할 장소에서 사용할 수있는 추가 정보 (일반 함수에서는 불가능 함)를 호출하고 호출해야하는 것과 같은 정보를 제공하는 것과 같은 추가 정보를 전달하는 역할을합니다 (동일한 동작은 얻을 수는 있지만 성능에 영향을 미침) 또는 기타 첨부 정보 (유형에 중첩 된 유형/유형 정의, 특성 검사에 대한 정보가있을 수 있음 ...)

+0

'std :: less'는 stateless이지만, 호출 가능한 객체가 stateless 일 필요는 없습니다. 상태 저장 객체는 어디서 얼마나 자주 대응되는지에 대한 보장이 없으므로 사용하기가 다소 까다 롭습니다. 따라서 무조건 호출 가능한 객체는 일반적으로 직접 상태를 유지하기보다는 상태에 대한 포인터를 보유합니다. –

+0

@PeteBecker : 동의했다. 나는 충분히 명확하지 않을 수도있다. 주 (州)를 가진 펑터에게는 옵션이 없다. 타입이나 함수 포인터로 구현 될 수있는 상태 비 저장 Functor의 경우, functor를 사용하면 코드를 더 최적화 할 수있는 컴파일러에 더 많은 정보를 제공 할 수 있습니다. –

1

일반 함수 나 자립형 또는 멤버는 함수가 호출 될 때 전달되는 인수 만 가질 수 있습니다. 따라서 함수에 여분의 데이터를 전달할 방법이 없습니다.

이것은 펑터와 다릅니다. Functor는 객체의 인스턴스이며 실제로는 생성자 (전달자를 전달할 때 사용하는)에 전달 된 데이터를 저장할 수 있습니다.

람다는 캡쳐를 사용하여 기술적으로 올바른 단어를 "저장할"수 있기 때문에 C++ 11에서는 약간의 혼란이 있습니다. 또는 std::bind을 사용하면 호출 가능한 객체가 실제로 호출 될 때 인수로 값을 바인딩 할 수 있습니다.