호출 가능 객체

함수 객체와 람다 비교

C++에서 callable은 함수 포인터, 함수 객체, lambda, std::function까지 포함하며, stateful predicate와 capture 수명은 STL 알고리즘 결과와 안정성을 바꾼다.

01

상태 필요 여부

비교 기준값, 카운터, 설정을 보관해야 하면 함수 객체나 캡처 lambda가 필요하다.

stateful
02

캡처 방식 결정

값 캡처는 복사본, 참조 캡처는 원본 수명에 의존한다.

[=] vs [&]
03

알고리즘 전달

sort, find_if, count_if는 predicate를 복사할 수 있으므로 부작용 의존을 줄인다.

predicate copies
04

타입 소거 판단

저장/교체 가능한 콜백 API가 필요하면 std::function을 쓰되 할당 비용을 고려한다.

erasure cost
function pointer
상태 없는 일반 함수 가볍지만 캡처가 없고 타입이 고정된다.
C style
functor
명명된 타입과 상태 보관 복잡한 비교 로직, 재사용, 테스트에 유리하다.
operator()
lambda
지역 문맥을 캡처해 짧게 작성 참조 캡처가 알고리즘 호출 이후까지 남으면 dangling 위험이 있다.
capture lifetime
std::function
서로 다른 callable을 한 타입으로 저장 편리하지만 inline 최적화와 할당 비용을 확인해야 한다.
type erasure

리뷰 포인트

strict ordering sort comparator는 comp(a,b)와 comp(b,a)가 동시에 참이 되면 안 된다.
참조 캡처 lambda가 저장되거나 비동기 실행되면 참조 대상 수명이 충분한지 확인한다.
비용 핫 루프에서는 std::function보다 템플릿 callable이 나을 수 있다.