본문 바로가기
C,C++/정보정리

[C/C++] Callable

by 마두식 2023. 2. 11.
반응형
Callable

-  호출 할 수 있는 모든 것을 의미한다.

=>  C++에서는 ()를 붙여서 호출할 수 있는 모든 것을 Callable이라고 정의한다.
ex) 함수, 함수 객체(Functor), 람다 함수 등

 

  • std::function

-  Callable 들을 객체의 형태로 보관할 수 있는 클래스

=>  C에서의 함수 포인터가 진짜 함수들만 보관 가능한 객체라고 한다면, std::function의 경우 함수 뿐만 아니라 모든 Callable 들을 보관할 수 있는 객체다.


-  function 객체는 템플릿 인자로 전달 받을 함수의 타입을 갖게 된다.

=>  함수의 타입이란, 리턴값과 함수의 인자들을 뜻한다.
ex)  std::function<int(const string&)>

 

  • 멤버 함수를 가지는 std::function

-  멤버 함수들의 경우 멤버 함수 내에서 this가 자기 자신을 호출한 객체를 의미하기 때문에, 멤버 함수를 그냥 function에 넣게 된다면 this가 무엇인지 알 수 없는 문제가 발생한다.

-  멤버 함수들은 구현 상 자신을 호출한 객체를 인자로 암묵적으로 받고 있다.

-  멤버 함수가 아닌 모든 함수들의 경우 함수 이름이 함수의 주소값으로 암시적 변환이 일어나지만, 멤버 함수들의 경우 암시적 변환이 발생하지 않는다.

=>  & 연산자를 통해 명시적으로 주소값을 전달해줘야 한다.

 

  • 멤버 함수들을 함수 객체로 - mem_fn

-  필요할 때마다 function 객체를 따로 만들어서 사용하는 것은 매우 불편함.

=>  function 객체를 리턴해버리는 함수가 추가됨.


-  mem_fn 함수는 이름 그대로, 전달된 멤버 함수를 function 객체로 만들어서 리턴해준다.

=>  mem_fn은 그리 자주 사용되지는 않는다. 람다 함수로도 동일한 작업을 수행할 수 있기 때문
==>  mem_fn을 사용하기 위해서는 <functional> 헤더를 추가해야 하지만, 람다 함수는 그냥 사용할 수 있어 좀 더 편리한 면이 있다.
==>  단, 코드 길이 면에서는 mem_fn을 사용하는 것이 좀 더 깔끔하다.

 

  • std::bind

-  함수 객체 생성 시에 인자를 특정한 것으로 지정할 수 있다.

-  bind 함수는 원래 함수에 특정 인자를 붙여(bind)준다.

-  기존 함수가 레퍼런스를 인자로 받는다면, bind 함수에서 특정 인자를 지정해줄때 명시적으로 레퍼런스를 전달해줘야 한다.

=>  그냥 전달하면 레퍼런스가 아니라 복사 된 값이 전달된다.
==>  명시적으로 레퍼런스로 전달할 때는 std::ref 함수를 이용한다.
※  std::ref 함수는 전달받은 인자를 복사 가능한 레퍼런스로 변환해준다.
※  const 레퍼런스의 경우 std::cref 함수를 호출하면 된다.

 

 

 


 

 

 

틀린 부분이나 이상한 부분이 있으면 댓글로 편하게 지적해주세요!

감사합니다!

 

참고

씹어먹는 C ++ - <14. 함수를 객체로! (C++ std::function, std::mem_fn, std::bind)> (modoocode.com)

반응형

댓글