std::function
| 헤더 <functional>
|
||
template< class >
class function; /* undefined */
|
에 정의됨 | |
template< class R, class... Args >
class function<R(Args...)>;
|
(C++11 이후) | |
클래스 템플릿 std::function은 범용 다형성 함수 래퍼입니다. std::function의 인스턴스는 CopyConstructible Callable 대상 — 함수 (함수에 대한 포인터를 통해), 람다 표현식, 바인드 표현식, 또는 기타 함수 객체와 멤버 함수에 대한 포인터 및 데이터 멤버에 대한 포인터를 저장, 복사 및 호출할 수 있습니다.
저장된 호출 가능 객체를 대상이라고 합니다. std::function에 대상이 없으면 이를 std::function비어 있음(empty)이라고 합니다. 비어 있음(empty) 의 비어 있음(empty) std::function 대상을 호출하면 std::bad_function_call 예외가 발생합니다.
std::function은 CopyConstructible 및 CopyAssignable 요구 사항을 충족합니다.
멤버 타입
| 유형 | 정의 |
result_type
|
R
|
argument_type
(C++17에서 사용 중단됨) (C++20에서 제거됨) |
T
만약
sizeof...
(
Args
)
==
1
이고
T
가
Args...
에서 첫 번째이자 유일한 타입인 경우
|
first_argument_type
(C++17에서 사용 중단됨) (C++20에서 제거됨) |
T1
만약
sizeof...
(
Args
)
==
2
이고
T1
가
Args...
에서 두 타입 중 첫 번째 타입인 경우
|
second_argument_type
(C++17에서 사용 중단됨) (C++20에서 제거됨) |
T2
만약
sizeof...
(
Args
)
==
2
이고
T2
가
Args...
에서 두 타입 중 두 번째 타입인 경우
|
멤버 함수
새로운
std::function
인스턴스를 생성
(public member function) |
|
std::function
인스턴스를 파괴
(public member function) |
|
|
새로운 대상을 할당
(public member function) |
|
|
내용을 교환
(public member function) |
|
|
(removed in C++17)
|
새로운 대상을 할당
(public member function) |
|
대상 포함 여부를 확인
(public member function) |
|
|
대상을 호출
(public member function) |
|
대상 접근 |
|
|
저장된 대상의
typeid
를 획득
(public member function) |
|
|
저장된 대상에 대한 포인터를 획득
(public member function) |
|
비멤버 함수
|
(C++11)
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
(C++20에서 제거됨)
|
std::function
과
nullptr
을 비교함
(함수 템플릿) |
헬퍼 클래스
|
(C++11)
(until C++17)
|
std::uses_allocator
타입 특성의 특수화
(클래스 템플릿 특수화) |
추론 가이드 (C++17부터)
참고 사항
|
후행 반환 타입이 없는 람다 표현식에서 참조를 결과 타입으로 하는
|
(C++23 이전) |
|
참조를 반환하는
|
(C++23 이후) |
std::function<const int&()> F([] { return 42; }); // C++23부터 오류: 반환된 참조를 임시 객체에 바인딩할 수 없음 // the returned reference to a temporary int x = F(); // C++23까지 미정의 동작: F()의 결과는 매달린 참조(dangling reference) std::function<int&()> G([]() -> int& { static int i{0x2A}; return i; }); // 정상 std::function<const int&()> H([i{052}] -> const int& { return i; }); // 정상
예제
#include <functional> #include <iostream> struct Foo { Foo(int num) : num_(num) {} void print_add(int i) const { std::cout << num_ + i << '\n'; } int num_; }; void print_num(int i) { std::cout << i << '\n'; } struct PrintNum { void operator()(int i) const { std::cout << i << '\n'; } }; int main() { // 자유 함수 저장 std::function<void(int)> f_display = print_num; f_display(-9); // 람다 저장 std::function<void()> f_display_42 = []() { print_num(42); }; f_display_42(); // std::bind 호출 결과 저장 std::function<void()> f_display_31337 = std::bind(print_num, 31337); f_display_31337(); // 멤버 함수 호출 저장 std::function<void(const Foo&, int)> f_add_display = &Foo::print_add; const Foo foo(314159); f_add_display(foo, 1); f_add_display(314159, 1); // 데이터 멤버 접근자 호출 저장 std::function<int(Foo const&)> f_num = &Foo::num_; std::cout << "num_: " << f_num(foo) << '\n'; // 멤버 함수와 객체 호출 저장 using std::placeholders::_1; std::function<void(int)> f_add_display2 = std::bind(&Foo::print_add, foo, _1); f_add_display2(2); // 멤버 함수와 객체 포인터 호출 저장 std::function<void(int)> f_add_display3 = std::bind(&Foo::print_add, &foo, _1); f_add_display3(3); // 함수 객체 호출 저장 std::function<void(int)> f_display_obj = PrintNum(); f_display_obj(18); auto factorial = [](int n) { // "재귀적 람다"를 모방하기 위해 람다 객체 저장; 추가 오버헤드 인지 std::function<int(int)> fac = [&](int n) { return (n < 2) ? 1 : n * fac(n - 1); }; // "auto fac = [&](int n) {...};"는 재귀 호출에서 작동하지 않음에 유의 return fac(n); }; for (int i{5}; i != 8; ++i) std::cout << i << "! = " << factorial(i) << "; "; std::cout << '\n'; }
가능한 출력:
-9 42 31337 314160 314160 num_: 314159 314161 314162 18 5! = 120; 6! = 720; 7! = 5040;
참고 항목
|
(C++23)
|
주어진 호출 시그니처에서 한정자를 지원하는 모든 호출 가능 객체의 이동 전용 래퍼
(클래스 템플릿) |
|
(C++26)
|
주어진 호출 시그니처에서 한정자를 지원하는 모든 복사 생성 가능 호출 가능 객체의 복사 가능 래퍼
(클래스 템플릿) |
|
(C++26)
|
모든 호출 가능 객체의 비소유 래퍼
(클래스 템플릿) |
|
(C++11)
|
빈
std::function
을 호출할 때 발생하는 예외
(클래스) |
|
(C++11)
|
멤버에 대한 포인터로부터 함수 객체를 생성함
(함수 템플릿) |
| typeid | 타입 정보를 질의하며, 해당 타입을 나타내는 std::type_info 객체를 반환함 |