본문 바로가기

PL/C & C++

[C++] 함수를 객체로 (C++ std::function, std::mem_fn, std::bind)

 

 

씹어먹는 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