씹어먹는 C ++ - <14. 함수를 객체로! (C++ std::function, std::mem_fn, std::bind)>
modoocode.com
- Callable 의 정의
- std::function
- std::mem_fn
- std::bind
1. Callable
Callable 이란, 이름 그대로 나타내듯이 호출(Call) 할 수 있는 모든 것을 의미합니다. 대표적인 예시로 함수를 들 수 있겠지요.
하지만 C++ 에서는 () 를 붙여서 호출할 수 있는 모든 것을 Callable 이라고 정의합니다. 예를 들어서




f 역시 일반적인 함수의 꼴을 하고 있지는 않지만, () 를 통해서 호출할 수 있기에 Callable 이라 할 수 있습니다.
2. std::function
C++ 에서는 이러한 Callable 들을 객체의 형태로 보관할 수 있는 std::function 이라는 클래스를 제공합니다. C 에서의 함수 포인터는 진짜 함수들만 보관할 수 있는 객체라고 볼 수 있다면 이 std::function 의 경우 함수 뿐만이 아니라 모든 Callable 들을 보관할 수 있는 객체 입니다.
이 std::function 을 어떻게 사용할 수 있는지 아래의 예시를 통해 보겠습니다.


3. 멤버 함수를 가지는 std::function
앞서 function 은 일반적인 Callable 들을 쉽게 보관할 수 있었지만, 멤버 함수들의 경우 이야기가 조금 달라집니다. 왜냐하면, 멤버 함수 내에서 this 의 경우 자신을 호출한 객체를 의미하기 때문에, 만일 멤버 함수를 그냥 function 에 넣게 된다면 this 가 무엇인지 알 수 없는 문제가 발생하게 됩니다.

컴파일 한다면 아래와 같은 컴파일 오류가 나게 됩니다.

왜냐하면 f1 을 호출하였을 때, 함수의 입장에서 자신을 호출하는 객체가 무엇인지 알 길이 없기 때문에 c 를 참조 하였을 때 어떤 객체의 c 인지를 알 수 없겠지요. 따라서 이 경우 f1 에 a 에 관한 정보도 추가로 전달해야 합니다.
그렇다면 이를 어떻게 할까요? 사실 멤버 함수들은 구현 상 자신을 호출한 객체를 인자로 암묵적으로 받고 있었습니다.
따라서 이를 받는 function 은 아래와 같은 형태로 나타나야 합니다.


와 같이 나옵니다.
'PL > C & C++' 카테고리의 다른 글
[C++] const_cast (0) | 2021.07.21 |
---|---|
[C++] type cast 4가지 종류 (0) | 2021.07.21 |
[C++] 무한대(infinity) (0) | 2021.07.16 |
[C++] 우선순위 큐(Priority Queue), pair<int, int> (0) | 2021.07.16 |
[C++] 2차원 배열 초기화 (0) | 2021.07.16 |