본문 바로가기

Functor

STL 벡터 내에서의 원소 정렬 std::vector에 어떤 원소들이 저장되어 있을 경우, T가 기본형이 아니라면 std::sort()와 같은 함수를 사용하기 위해서는 비교 함수를 제공해야 한다. std::sort()를 사용하는 예제는 대부분 기본형을 사용하기 때문에, 실질적으로 컨테이너 안의 원소들을 정렬하고 싶은 경우 난감했던 경우가 있을 것이다. std::vector의 원소의 정렬을 위한 비교 함수는, 가장 간단하게 다음과 같이 작성할 수 있다. bool Compare(T& lhs, T& rhs) { return lhs < rhs; // 비교하고 싶은 T 타입의 데이터 멤버를 비교해야 한다 } 이 방법은 비교 함수가 전역으로 선언되어야 하기 때문에 경우에 따라서는 적절하지 않을 수도 있다. 그리고, std::ve.. 더보기
delegate / event System.Windows.Forms.Form의 Paint 핸들러는, public delegate void PaintEventHandler(object objSender, PaintEventArgs pea); 의 형식으로 정의되어 있는 delegate이다. 사실, Form을 상속받는 Form을 하나 생성했을 때, 여기에 어떠한 paintEventHandler를 설치하지 않아도 기본적으로 배경은 그려진다. 이것은, 이미 설치되어 있는 PaintEventHandler가 존재한다는 말인데, 그것은 어디에 있을까? 그것은 System.Windows.Forms.Control에 이미 설치되어 있다. 즉, 다음과 같은 빈 깡통 Form을 하나 생성해보자. 이 Form이 화면에 그려질 때, 어떤 일이 발생할까? cla.. 더보기
C# delegate C/C++은 실행 시점에서 동작을 결정하기 위해서 함수 포인터를 사용한다. C++은 실행 시점에서의 동작을 정하기 위해 가상 함수와 같은 매커니즘을 사용하지만, 근본적으로는 함수 포인터를 사용한다. 그렇다면, C#에서는 어떤가? C#은 포인터라는 개념을 직접적으로 지원하지 않기 때문에 함수에 대한 주소를 얻어낸다는 것은 불가능하다. 따라서, 언뜻 생각하기에 Win32 API에서의 콜백 함수 호출은 문제가 있어보인다. 윈도우 메세지는 LRESULT 리턴 형식과 WPARAM, LPARAM이라는 두개의 32비트 파라미터를 가지며, 이 파라미터의 내용은 부호없는 정수 형식인 윈도우 메세지 내용에 따라 달라지기 때문이다. 다형성은, 함수의 시그내처를 보고 결정되기 때문에, 윈도우 메세지를 해석해서 동작을 결정해야.. 더보기