함수 개체 또는 functor는 구현하는 모든 형식입니다operator()
. 이 연산자는 호출 연산자 또는 경우에 따라 애플리케이션 연산자라고 합니다. C++ 표준 라이브러리는 기본적으로 함수 개체를 컨테이너의 정렬 기준 및 알고리즘에서 사용합니다.
함수 개체는 일반 함수 호출에 비해 두 가지 주요 이점을 제공합니다. 첫 번째는 함수 개체에 상태를 포함할 수 있다는 점입니다. 두 번째는 함수 개체가 형식이므로 템플릿 매개 변수로 사용할 수 있다는 점입니다.
함수 개체 만들기
함수 개체를 만들려면 형식을 만들고 다음과 같이 구현 operator()
합니다.
class LessThanFunctor
{
public:
bool operator()(int a, int b)
{
return a < b;
}
};
int main()
{
LessThanFunctor less_than;
int a = 5;
int b = 7;
bool ans = less_than(a, b);
}
main
함수의 마지막 줄은 함수 개체를 호출하는 방법을 보여 줍니다. 이 호출은 함수에 대한 호출처럼 보이지만 실제로는 형식을 호출 operator()
합니다 LessThanFunctor
. 함수 개체 호출과 함수의 이러한 유사성은 함수 개체라는 용어가 나타난 방식입니다.
함수 개체 및 컨테이너
C++ 표준 라이브러리는 헤더 파일에 여러 함수 개체를 <functional>
포함합니다. 이러한 함수 개체의 용도 중 하나는 컨테이너의 정렬 기준입니다. 예를 들어 set
컨테이너는 다음과 같이 선언됩니다.
template <class Key,
class Compare = std::less<Key>,
class Allocator = std::allocator<Key>>
class set;
두 번째 템플릿 인수는 함수 개체 less
입니다. 이 함수 개체는 첫 번째 매개 변수가 두 번째 매개 변수보다 작은 경우 반환 true
합니다. 일부 컨테이너는 해당 요소를 정렬하므로 컨테이너에는 두 요소를 비교하는 방법이 필요합니다. 비교는 함수 개체를 사용하여 수행됩니다. 함수 개체를 만들고 컨테이너에 대한 템플릿 목록에서 지정하여 컨테이너의 고유한 정렬 기준을 정의할 수 있습니다.
함수 개체 및 알고리즘
함수 개체의 또 다른 사용은 알고리즘에 있습니다. 예를 들어 remove_if
알고리즘은 다음과 같이 선언됩니다.
template <class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if(
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred);
remove_if
에 대한 마지막 인수는 부울 값을 반환하는 개체 함수( predicate)입니다. 함수 개체 true
의 결과가면 요소가 반환 remove_if
된 새 끝을 벗어나기 위해 이동됩니다. 인수 <functional>
에 대해 헤더에 pred
선언된 함수 개체를 사용하거나 직접 만들 수 있습니다.