함수 객체
모두의 코드 내용을 공부하고 정리한 내용입니다.
함수 객체
- 함수는 아니지만 함수 처럼 작동하는 객체 Function Object => Functor
- 함수 처럼 작동하는 객체 ==> 객체를 함수처럼 작동하게 만든다.
- 이를 위해 operator() 연산자를 오버로딩해야한다.(호출 연산자)
- 함수 객체를 호출하면 객체.operator()(인자값) 형태로 호출하지만 중간에 .operator가 생략
- 이를 암묵적 호출이라 한다. 반면 위처럼 표현을 온전히 하는것은 명시적 호출이다.
class Compare
{
public:
int operator()(int a, int b)
{
return a > b;
}
};
int main()
{
Compare com;
cout << "compare(10, 20): " << com(10, 20) << endl;
return 0;
}
- 위 처럼 그냥 사용하지 않고 보통 함수의 인수로 전달될 때 사용된다.
- 왜 사용하나?
- 일반 함수와 달리 호출 연산자 이외 데이터를 저장할 변수를 만들어 필요한 속성, 상태를 포함할 수 있다.
- 함수객체의 생성과 실행 시점이 다르다.
- 함수 객체는 타입이므로, 템플릿 인수로 사용될 수 있다.
- 일반 함수는 호출시 바로 실행되지만 함수 객체는 생겅한다고 실행되는게 아니다.
- 함수 객체를 함수에 전달해서 사용이 가능하다.
template <typename T>
void sort(T& t) {
for (int i = 0; i < t.size(); i++) {
for (int j = i + 1; j < t.size(); j++) {
if (t[i] > t[j]) {
t.swap(i, j);
}
}
}
}
template <typename T, typename Comp>
void bubble_sort(T& t, Comp& comp) {
for (int i = 0; i < t.size(); i++) {
for (int j = i + 1; j < t.size(); j++) {
if (!comp(t[i], t[j])) {
t.swap(i, j);
}
}
}
}
struct Comp1 {
bool operator()(int a, int b) { return a > b; }
};
struct Comp2 {
bool operator()(int a, int b) { return a < b; }
};
int main(){
Comp1 comp1;
Comp2 comp2;
sort(나만의 컨테이너 객체, comp1); // 내림차순
sort(나만의 컨테이너 객체, comp1); // 오름차순
}
개인 공부 기록용 블로그입니다.
틀린 부분 있으다면 지적해주시면 감사하겠습니다!!
댓글남기기