일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 크리티컬섹션
- 강참조
- 언리얼엔진구조체
- 데이터애셋
- 알고리즘
- 스마트포인터
- C++
- map
- enumasByue
- BFS
- stl
- dataasset
- 약참조
- C++최적화
- moreeffectiveC++
- 선택정렬
- 람다
- unorder_map
- UE4 커스텀로그
- UML관련
- 언리얼가비지컬렉터
- UE_LOG
- 정렬알고리즘
- 애셋로드
- 자료구조
- 델리게이트
- 프로그래머스
- UELOG
- 람다사용정렬
- 정렬
- Today
- Total
기억을 위한 기록들
[CPP] 함수 객체에 관하여 본문
어떤클래스의 함수 호출 연산자를 오버로딩해서 그 클래스의 객체를 함수 포인터처럼 사용하게 만들 수 있다.
이렇게 사용하는 객체를 함수 객체 또는 간단히 펑터라 부른다.
표준 라이브러리 알고리즘 (STL 알고리즘) 중에 find_if()와 accumulate()를 비롯한 여러 알고리즘은 함수 포인터, 람다 표현식, 펑터 등을 비롯한 호출 가능한 객체를 인수로 받아서 여러 알고리즘의 동작을 변경할 수 있다. C++는 이를 위해 여러가지 펑터 클래스를 <functional> 헤더파일에 정의 해두었다. 이런것들은 주로 콜백 연산에 자주 사용된다.
펑터의 개념은 간단하지만 작성과정은 상당히 번거롭다.
함수나 펑터 클래스를 생성해서 다른 것과 중복되지 않게 이름을 정한 다음, 그 이름을 사용하도록 작성해야한다.
이럴 때는 람다표현식을 이용하며 익명함수로 만들면 굉장히 편한다.
현재 사용하는 c++버전에 따라 <functional> 헤더파일에는 bind1st(),bind2nd(),mem_fun(), mem_fun_ref(), ptr_fun()과 같은 함수도 정의 돼 있을 수도 있다. 이들 함수는 C++17부터 공식적으로 삭제됐다.
어떤 문법이든 사용하고 말고에 대한것에 상황에 따라 다르고, 사용하더라도 각각의 장단점이 있겠지만, 람다 표현식을 사용하면 코드 읽기 쉽고, 세련되게 작성할 수 있다. 함수 객체보다는 람다 표현식으로 간단히 작성하는 것이 바람직하다. 함수객체는 람다 표현식으로 할수 없는 복잡한 작업을 처리할 때만 사용하기 바란다.
참고서적 :
http://www.yes24.com/Product/Goods/77669043
'C & CPP' 카테고리의 다른 글
[CPP] std::stringstream에 관하여 (0) | 2022.06.06 |
---|---|
[CPP] const와 constexpr (0) | 2022.05.25 |
[CPP]std::function에 관하여 (0) | 2022.02.02 |
[CPP] using 과 typedef (0) | 2021.11.10 |
[CPP] C++에서의 1e-6f 란? (과학적 표기법/scientific notation) (0) | 2021.09.14 |