Namespaces
Variants

Function objects

From cppreference.net
Utilities library
Function objects
Function invocation
(C++17) (C++23)
Identity function object
(C++20)
Old binders and adaptors
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
( until C++17* ) ( until C++17* )
( until C++17* ) ( until C++17* )

( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )

함수 객체 는 함수 호출 연산자가 정의된 모든 객체입니다. C++는 많은 내장 함수 객체를 제공하며 새로운 함수 객체의 생성과 조작을 지원합니다.

목차

함수 호출

설명 전용 연산 INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) 은 다음과 같이 정의됩니다:

타입 Obj arg_0 의 한정되지 않은 타입으로 설정합니다 (즉, std:: remove_cv < std:: remove_reference < decltype ( arg_0 ) > :: type > :: type )

  • 만약 f 가 클래스 C 멤버 함수 포인터 라면, INVOKE ( f, obj, arg_1, arg_2, ..., arg_N ) 는 다음과 동등합니다:
  • ( obj. * f ) ( arg_1, arg_2, ..., arg_N ) (객체에서 멤버 함수를 호출합니다).
  • ( obj. get ( ) . * f ) ( arg_1, arg_2, ..., arg_N ) (특수 참조된 객체에서 멤버 함수를 호출합니다).
  • 그 외의 경우
  • ( ( * obj ) . * f ) ( arg_1, arg_2, ..., arg_N ) (역참조된 객체에서 멤버 함수를 호출합니다).
  • obj. * mptr (객체의 데이터 멤버에 접근).
  • obj. get ( ) . * mptr (특수 참조된 객체의 데이터 멤버에 접근).
  • 그 외의 경우
  • ( * obj ) . * mptr (역참조된 객체의 데이터 멤버에 접근).
  • 그 외의 경우
  • INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) f ( arg_0, arg_1, arg_2, ..., arg_N ) 와 동등합니다 (호출 가능 객체를 호출합니다).


설명 전용 연산 INVOKE<R> ( f, arg_0, arg_1, arg_2, ..., arg_N ) 은 다음과 같이 정의됩니다:

  • 만약 R 가 (cv 한정자가 있을 수 있는) void 인 경우
  • static_cast < void > ( INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) ) .
  • 그 외의 경우
  • INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) R 로 암시적으로 변환됩니다.

Actual 타입을 decltype ( INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) ) 로 정의한다.

  • INVOKE<R> ( f, arg_0, arg_1, arg_2, ..., arg_N ) 는 올바르지 않은 형식(ill-formed)이다.
(C++23부터)
(C++11 이후)


std::invoke std::invoke_r (C++23부터) 는 주어진 인수로 Callable 객체를 INVOKE INVOKE<R> (C++23부터) 규칙에 따라 호출할 수 있습니다.

(C++17) (C++23)
주어진 인수로 임의의 Callable 객체를 호출 및 반환 타입 지정 가능 (since C++23)
(함수 템플릿)

함수 래퍼

이러한 다형성 래퍼 클래스들은 임의의 함수 객체를 저장하기 위한 지원을 제공합니다.

(C++11)
복사 생성 가능한 모든 호출 가능 객체의 복사 가능 래퍼
(클래스 템플릿)
주어진 호출 시그니처에서 한정자를 지원하는 모든 호출 가능 객체의 이동 전용 래퍼
(클래스 템플릿)
주어진 호출 시그니처에서 한정자를 지원하는 복사 생성 가능한 모든 호출 가능 객체의 복사 가능 래퍼
(클래스 템플릿)
모든 호출 가능 객체의 비소유 래퍼
(클래스 템플릿)
std::function 을 호출할 때 발생하는 예외
(클래스)
(C++11)
멤버에 대한 포인터로부터 함수 객체를 생성함
(함수 템플릿)

Identity

std::identity 는 항등 함수 객체입니다: 인수를 변경 없이 그대로 반환합니다.

(C++20)
인수를 변경 없이 반환하는 함수 객체
(클래스)

부분 함수 적용

std::bind_front std::bind 부분 함수 적용(partial function application) , 즉 함수에 인수를 바인딩하여 새로운 함수를 생성하는 기능을 지원합니다.

(C++20) (C++23)
함수 객체에 가변 개수의 인수를 순서대로 바인딩합니다
(함수 템플릿)
(C++11)
함수 객체에 하나 이상의 인수를 바인딩합니다
(함수 템플릿)
객체가 std::bind 표현식이거나 그렇게 사용될 수 있음을 나타냅니다
(클래스 템플릿)
객체가 표준 플레이스홀더이거나 그렇게 사용될 수 있음을 나타냅니다
(클래스 템플릿)
std::placeholders 네임스페이스에 정의됨
std::bind 표현식에서 바인딩되지 않은 인수에 대한 플레이스홀더
(상수)

부정자

std::not_fn 전달된 호출 가능 객체의 호출 결과를 부정하는 함수 객체를 생성합니다.

(C++17)
보유한 함수 객체의 결과의 보수를 반환하는 함수 객체를 생성합니다
(함수 템플릿)

검색기

여러 문자열 검색 알고리즘을 구현하는 검색기들이 제공되며, 이들은 직접 사용하거나 std::search 와 함께 사용할 수 있습니다.

표준 C++ 라이브러리 검색 알고리즘 구현
(클래스 템플릿)
Boyer-Moore 검색 알고리즘 구현
(클래스 템플릿)
Boyer-Moore-Horspool 검색 알고리즘 구현
(클래스 템플릿)

레퍼런스 래퍼

참조 래퍼는 참조 인수들을 복사 가능한 함수 객체에 저장할 수 있게 합니다:

CopyConstructible CopyAssignable 참조 래퍼
(클래스 템플릿)
(C++11) (C++11)
인수에서 추론된 타입으로 std::reference_wrapper 생성
(함수 템플릿)
std::reference_wrapper 내에 래핑된 참조 타입 획득
(클래스 템플릿)

투명 함수 객체

연관 컨테이너 비순차 연관 컨테이너 (C++20부터) 는 이종 탐색 및 삭제 연산 (C++23부터) 을 제공하지만, 이는 제공된 함수 객체 타입 T 투명 할 때만 활성화됩니다: 한정된 식별자 T::is_transparent 가 유효하고 타입을 나타내야 합니다.

표준 라이브러리의 모든 투명 함수 객체 타입은 중첩 타입 is_transparent 를 정의합니다. 그러나 사용자 정의 투명 함수 객체 타입은 is_transparent 를 직접 중첩 타입으로 제공할 필요가 없습니다: T::is_transparent 가 위에서 명시된 투명 요구 사항을 만족하는 한 기본 클래스에 정의될 수 있습니다.

(C++14부터)

연산자 함수 객체

C++는 다음과 같은 일반적인 산술 및 논리 연산을 나타내는 함수 객체들을 정의합니다.

void 특수화는 매개변수 타입과 반환 타입을 인자로부터 추론하며, 이들은 모두 투명(transparent) 입니다.

(C++14부터)
산술 연산
x + y 를 구현하는 함수 객체
(클래스 템플릿)
매개변수 및 반환 타입을 추론하는 x + y 를 구현하는 함수 객체
(클래스 템플릿 특수화)
x - y 를 구현하는 함수 객체
(클래스 템플릿)
매개변수 및 반환 타입을 추론하는 x - y 를 구현하는 함수 객체
(클래스 템플릿 특수화)
x * y 를 구현하는 함수 객체
(클래스 템플릿)
매개변수 및 반환 타입을 추론하는 x * y 연산을 구현하는 함수 객체
(클래스 템플릿 특수화)
x / y 를 구현하는 함수 객체
(클래스 템플릿)
매개변수 및 반환 타입을 추론하는 x / y 연산을 구현하는 함수 객체
(클래스 템플릿 특수화)
x % y 를 구현하는 함수 객체
(클래스 템플릿)
매개변수 및 반환 타입을 추론하는 x % y 연산을 구현하는 함수 객체
(클래스 템플릿 특수화)
- x 를 구현하는 함수 객체
(클래스 템플릿)
매개변수 및 반환 타입을 추론하는 - x 를 구현하는 함수 객체
(클래스 템플릿 특수화)
비교 연산
x == y 를 구현하는 함수 객체
(클래스 템플릿)
매개변수 및 반환 타입을 추론하는 x == y 를 구현하는 함수 객체
(클래스 템플릿 특수화)
x ! = y 를 구현하는 함수 객체
(클래스 템플릿)
매개변수 및 반환 타입을 추론하는 x ! = y 를 구현하는 함수 객체
(클래스 템플릿 특수화)
x > y 를 구현하는 함수 객체
(클래스 템플릿)
매개변수 및 반환 타입을 추론하는 x > y 함수 객체 구현
(클래스 템플릿 특수화)
x < y 를 구현하는 함수 객체
(클래스 템플릿)
매개변수 및 반환 타입을 추론하는 x < y 연산을 구현하는 함수 객체
(클래스 템플릿 특수화)
x >= y 를 구현하는 함수 객체
(클래스 템플릿)
매개변수 및 반환 타입을 추론하는 x >= y 를 구현하는 함수 객체
(클래스 템플릿 특수화)
함수 객체 구현: x <= y
(클래스 템플릿)
매개변수 및 반환 타입을 추론하는 x <= y 를 구현하는 함수 객체
(클래스 템플릿 특수화)
논리 연산
x && y 를 구현하는 함수 객체
(클래스 템플릿)
매개변수 및 반환 타입을 추론하는 x && y 를 구현하는 함수 객체
(클래스 템플릿 특수화)
x || y 를 구현하는 함수 객체
(클래스 템플릿)
매개변수 및 반환 타입을 추론하는 x || y 를 구현하는 함수 객체
(클래스 템플릿 특수화)
! x 를 구현하는 함수 객체
(클래스 템플릿)
매개변수 및 반환 타입을 추론하는 ! x 를 구현하는 함수 객체
(클래스 템플릿 특수화)
비트 연산
x & y 를 구현하는 함수 객체
(클래스 템플릿)
매개변수 및 반환 타입을 추론하는 x & y 를 구현하는 함수 객체
(클래스 템플릿 특수화)
x | y 를 구현하는 함수 객체
(클래스 템플릿)
x | y 를 구현하는 함수 객체
매개변수 및 반환 타입 추론
(클래스 템플릿 특수화)
x ^ y 를 구현하는 함수 객체
(클래스 템플릿)
매개변수 및 반환 타입을 추론하는 x ^ y 를 구현하는 함수 객체
(클래스 템플릿 특수화)
(C++14)
~x 를 구현하는 함수 객체
(클래스 템플릿)
매개변수 및 반환 타입을 추론하는 ~x 를 구현하는 함수 객체
(클래스 템플릿 특수화)


제약된 비교 함수 객체

다음 비교 함수 객체들은 제약된 함수 객체입니다.

  • 동등 연산자 ( ranges::equal_to ranges::not_equal_to )는 인자 타입이 equality_comparable_with 를 만족해야 합니다.
  • 관계 연산자 ( ranges::less , ranges::greater , ranges::less_equal , ranges::greater_equal )는 인자 타입이 totally_ordered_with 를 만족해야 합니다.
  • 삼중 비교 연산자 ( compare_three_way )는 타입이 three_way_comparable_with 를 모델링해야 합니다.

이 모든 함수 객체들은 투명 합니다.

x == y 를 구현하는 제약된 함수 객체
(클래스)
x ! = y 를 구현하는 제약된 함수 객체
(클래스)
x < y 를 구현하는 제약된 함수 객체
(클래스)
x > y 를 구현하는 제약된 함수 객체
(클래스)
x <= y 를 구현하는 제약된 함수 객체
(클래스)
x >= y 를 구현하는 제약된 함수 객체
(클래스)
x <=> y 를 구현하는 제약된 함수 객체
(클래스)
(C++20부터)


도우미 항목

다음 설명 전용 항목들은 표준 라이브러리의 여러 구성 요소에 사용되지만 표준 라이브러리의 인터페이스 부분은 아닙니다.

template < class Fn, class ... Args >

concept /*callable*/ =
requires ( Fn && fn, Args && ... args ) {
std:: forward < Fn > ( fn ) ( std:: forward < Args > ( args ) ... ) ;

} ;
(1) ( 설명 전용* )
template < class Fn, class ... Args >

concept /*nothrow-callable*/ =
/*callable*/ < Fn, Args... > &&
requires ( Fn && fn, Args && ... args ) {
{ std:: forward < Fn > ( fn ) ( std:: forward < Args > ( args ) ... ) } noexcept ;

} ;
(2) ( 설명 전용* )
template < class Fn, class ... Args >
using /*call-result-t*/ = decltype ( std:: declval < Fn > ( ) ( std:: declval < Args > ( ) ... ) ) ;
(3) ( 설명 전용* )
template < const auto & T >
using /*decayed-typeof*/ = decltype ( auto ( T ) ) ;
(4) ( 설명 전용* )
(C++26부터)


구형 바인더 및 어댑터

초기 기능 지원을 제공했던 여러 유틸리티들은 더 이상 사용되지 않으며 제거되었습니다:

베이스
(C++11에서 사용 중단됨) (C++17에서 제거됨)
어댑터 호환 단항 함수 베이스 클래스
(클래스 템플릿)
(C++11에서 사용 중단됨) (C++17에서 제거됨)
어댑터 호환 이항 함수 베이스 클래스
(클래스 템플릿)
바인더
(C++11에서 사용 중단됨) (C++17에서 제거됨)
이항 함수와 그 인수 중 하나를 보유하는 함수 객체
(클래스 템플릿)
(C++11에서 사용 중단됨) (C++17에서 제거됨)
이진 함수에 하나의 인수를 바인딩함
(함수 템플릿)
함수 어댑터
(C++11에서 사용 중단됨) (C++17에서 제거됨)
단항 함수 포인터용 어댑터 호환 래퍼
(클래스 템플릿)
(C++11에서 사용 중단됨) (C++17에서 제거됨)
이항 함수 포인터용 어댑터 호환 래퍼
(클래스 템플릿)
(C++11에서 사용 중단됨) (C++17에서 제거됨)
함수 포인터로부터 어댑터 호환 함수 객체 래퍼를 생성함
(함수 템플릿)
(C++11에서 사용 중단됨) (C++17에서 제거됨)
객체 포인터로 호출 가능한 nullary 또는 unary 멤버 함수 포인터를 위한 래퍼
(클래스 템플릿)
(C++11에서 사용 중단됨) (C++17에서 제거됨)
객체 포인터로 호출 가능한 멤버 함수 포인터로부터 래퍼를 생성함
(함수 템플릿)
(C++11에서 사용 중단됨) (C++17에서 제거됨)
객체 참조로 호출 가능한 nullary 또는 unary 멤버 함수 포인터를 위한 래퍼
(클래스 템플릿)
(C++11에서 사용 중단됨) (C++17에서 제거됨)
객체에 대한 참조로 호출 가능한 멤버 함수 포인터로부터 래퍼를 생성합니다
(함수 템플릿)
(C++17에서 사용 중단됨) (C++20에서 제거됨)
보유한 단항 predicate의 보수를 반환하는 래퍼 함수 객체
(클래스 템플릿)
(C++17에서 사용 중단됨) (C++20에서 제거됨)
보유한 이항 predicate의 보수를 반환하는 wrapper 함수 객체
(클래스 템플릿)
(C++17에서 사용 중단됨) (C++20에서 제거됨)
사용자 정의 std::unary_negate 객체를 생성합니다
(함수 템플릿)
(C++17에서 사용 중단됨) (C++20에서 제거됨)
사용자 정의 std::binary_negate 객체를 생성합니다
(함수 템플릿)
(C++20 이전)

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 185 C++98 함수 객체 사용이 프로그램 효율성을 향상시킨다고 명시됨 해당 주장 삭제
LWG 660 C++98 비트 연산을 위한 함수 객체가 누락됨 추가됨
LWG 2149 C++98 하나 또는 두 개의 인수를 취하는 함수 객체는
인수 및 결과 타입을 나타내는 중첩 타입을 제공해야 했음
필수 아님
LWG 2219 C++11 INVOKE std::reference_wrapper 를 올바르게 처리하지 않음 올바르게 처리함
LWG 2420 C++11 INVOKE<R> R void 인 경우 반환 값을 버리지 않음 이 경우 반환 값을 버림
LWG 2926
( P0604R0 )
C++11 반환 타입 R 을 갖는 INVOKE 연산의 구문이
INVOKE ( f, t1, t2, ..., tN, R ) 였음
다음으로 변경됨
INVOKE<R> ( f, t1, t2, ..., tN )
LWG 3655 C++11 INVOKE LWG 이슈 2219 의 해결로 인해
union을 올바르게 처리하지 않음
올바르게 처리함