Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
std::tuple,
std::bind, std::function
NHN NEXT TEAM POOPTUBE
tuple이 필요할 때
 함수의 반환 값으로 2개 이상의 값을 반환할 때
 이를 위해 구조체를 만들거나 컨테이너를 사용하는 것은 배보다 배꼽이 더 크다.
tuple
 #include <tuple> 헤더 파일을 추가한다.
 std::tuple<int, std::string, ITEM> UserItem 과 같은 형태로 선언한다.
 std::get<>에 저장된 값의 위치를 선언하면 해당 값을 사용할 수 있다.
 std::cout << std::get<0>(UserItem) << std::endl;
 std::get<0>(UserItem) = 2; 처럼 저장된 값을 변경할 수도 있다.
투플 정의하기
tuple에 저장한 데이터 개수 알기
tuple의 요소를 한꺼번에 다른 변수에 담기
tuple과 tuple 합치기
std::bind
 std::bind1st와 std::bind2nd를 보다 일반화시킨 함수
 임의의 함수, 함수 포인터, 함수 객체, 멤버 함수를 함수 객체로 만들 수 있으며, 원하는 위치에 원하
는 값을 전달시킬 수 있는 함수 객체를 만들어 준다.
 #include <functional>
std::bind의 기본적인 사용
 std::bind( f, 1, 2)의 리턴값은 f(1,2)처럼 행동하는 함수 객체를 리턴한다.
 std::bind(g, 1, 2, 3)의 리턴값을 g(1, 2, 3)처럼 행동하는 함수 객체를 리턴한다.
std::placeholder
 _1, _2, _3 등의 _N은 전달되는 인수 목록의 N 번째 자리의 인수를 _N이 써진 곳에 대입하겠다는 뜻
Std bind
이런 것도 가능하다.
함수 구조체도 bind할 수 있다.
오버로드된 함수가 있을 때
 std::bind<return-type>을 지정해주어야 한다.
함수 포인터의 제약 사항
 흔히 이벤트가 발생한 상황에 맞게 콜백 함수를 동적으로 다르게 가져가고 싶을 때 함수 포인터를
사용한다.
 하지만 함수 포인터는 동일한 시그너쳐를 가지는 함수만 대입시킬 수 있는 한계가 있다.
 그리고 오직 함수만 넘길 수 있다는 점도 아쉽다.
 그리고 반환 타입이 int 인 함수 포인터에 대입되는 함수들은 반드시 반환 타입이 int여야 한다는 제
약도 있다.
 다시 말해 함수 포인터의 반환 타입과 일치하는 반환 타입을 가진 함수만 함수 포인터에 담을 수 있
다.
std::function
 어떤 함수가 가진 시그니처와 호환되는 시그니처를 갖는 함수 호출성 개체의 표현을 가능하게 해주
는 템플릿이다.
 즉, 함수 반환갑 역시 호환이 가능하다면(암시적 형변환이 가능하다면) 사용할 수 있다.
 적접한 함수호출성 개체(callable object)라면 사용할 수 있다.
함수호출성 개체(callable object)
 함수 포인터
 함수 객체
 멤버 함수 포인터
 lamda 함수
 bind 반환갑
std::function
 요약하면,
 std::function은 템플릿 클래스는 반환값이 암시적으로 형 변환이 가능하고
 함수호출성 개체라면 사용할 수 있기 때문에
 함수 포인터에 비해 유연성이 뛰어나다.
std::function 예제
std::function 예제(계속)
std::function 예제(계속)
예제에서 확인할 수 있는 것들
 반환값이 다르지만, 암시적으로 형변환이 가능하면 OK
 bind를 이용한 함수 객체 OK
 bind를 이용한 멤버 함수 OK
 람다 함수 OK
참고자료
 MSDN
 http://sweeper.egloos.com/
 Thinking About C++ STL 프로그래밍, 최흥배, 한빛미디어

More Related Content

Std bind