types_is_invocable (호출 가능 여부 판정)
이 페이지는 C++ 표준 라이브러리의 is_invocable 및 관련 타입 특성에 대해 설명해요. 주어진 함수 객체와 인자 목록으로 호출이 가능한지, 예외를 던지지 않는지, 원하는 반환 타입과 일치하는지 등을 컴파일 타임에 판정할 수 있어요. C++17부터 사용할 수 있어요.
출처: cppreference
본문
정의
<type_traits> 헤더에 정의되어 있어요.
| 템플릿 |
구분 |
버전 |
template < class Fn , class ... ArgTypes > struct is_invocable ; |
(1) |
(since C++17) |
template < class R , class Fn , class ... ArgTypes > struct is_invocable_r ; |
(2) |
(since C++17) |
template < class Fn , class ... ArgTypes > struct is_nothrow_invocable ; |
(3) |
(since C++17) |
template < class R , class Fn , class ... ArgTypes > struct is_nothrow_invocable_r ; |
(4) |
(since C++17) |
만약 Fn, R 또는 매개변수 팩 ArgTypes 안의 어떤 타입이 완전 타입(complete type)이 아니거나, (cv 한정 가능한) void, 또는 경계를 알 수 없는 배열이라면, 동작은 정의되지 않아요.
위 템플릿 중 하나의 인스턴스화가 직접 또는 간접적으로 불완전 타입에 의존하고, 그 타입이 가상으로 완전해졌을 때 인스턴스화 결과가 달라질 수 있다면, 동작은 정의되지 않아요.
프로그램이 이 페이지에 설명된 템플릿 중 하나에 대해 특수화를 추가하면, 동작은 정의되지 않아요.
헬퍼 변수 템플릿
| 템플릿 |
구분 |
버전 |
template < class Fn , class ... ArgTypes > constexpr bool is_invocable_v = std :: is_invocable < Fn , ArgTypes ... >:: value ; |
(1) |
(since C++17) |
template < class R , class Fn , class ... ArgTypes > constexpr bool is_invocable_r_v = std :: is_invocable_r < R , Fn , ArgTypes ... >:: value ; |
(2) |
(since C++17) |
template < class Fn , class ... ArgTypes > constexpr bool is_nothrow_invocable_v = std :: is_nothrow_invocable < Fn , ArgTypes ... >:: value ; |
(3) |
(since C++17) |
template < class R , class Fn , class ... ArgTypes > constexpr bool is_nothrow_invocable_r_v = std :: is_nothrow_invocable_r < R , Fn , ArgTypes ... >:: value ; |
(4) |
(since C++17) |
std::integral_constant로부터 상속받은 멤버
멤버 상수
| 멤버 |
설명 |
value [static] |
오버로드 (1)의 경우 INVOKE(std::declval<Fn>(), std::declval<ArgTypes>()...)가 비평가 피연산자(unevaluated operand)로 취급될 때 유효한 식(well-formed)이면 true, 그렇지 않으면 false (공용 정적 멤버 상수) |
멤버 함수
| 멤버 함수 |
설명 |
operator bool |
객체를 bool로 변환하고 value를 반환해요 (공용 멤버 함수) |
operator() (C++14) |
value를 반환해요 (공용 멤버 함수) |
멤버 타입
| 타입 |
정의 |
value_type |
bool |
type |
std::integral_constant<bool, value> |
Notes
| 기능 테스트 매크로 |
값 |
표준 |
기능 |
__cpp_lib_is_invocable |
201703L |
(C++17) |
std::is_invocable, std::invoke_result |
예제
#include <type_traits>
auto func2(char) -> int (*)()
{
return nullptr;
}
int main()
{
static_assert(std::is_invocable_v<int()>);
static_assert(not std::is_invocable_v<int(), int>);
static_assert(std::is_invocable_r_v<int, int()>);
static_assert(not std::is_invocable_r_v<int*, int()>);
static_assert(std::is_invocable_r_v<void, void(int), int>);
static_assert(not std::is_invocable_r_v<void, void(int), void>);
static_assert(std::is_invocable_r_v<int(*)(), decltype(func2), char>);
static_assert(not std::is_invocable_r_v<int(*)(), decltype(func2), void>);
}
같이 보기
| 항목 |
설명 |
invoke, invoke_r (C++17) (C++23) |
주어진 인자로 호출 가능한 객체를 호출하고 반환 타입을 지정할 수 있어요 (C++23부터) (함수 템플릿) [edit] |
result_of, invoke_result (C++11) (removed in C++20) (C++17) |
호출 가능한 객체를 인자 집합으로 호출했을 때의 결과 타입을 추론해요 (클래스 템플릿) [edit] |
invocable, regular_invocable (C++20) (C++20) |
호출 가능한 타입이 주어진 인자 타입 집합으로 호출될 수 있음을 명시해요 (개념) [edit] |
is_invocable_type, is_invocable_r_type, is_nothrow_invocable_type, is_nothrow_invocable_r_type (C++26) (C++26) (C++26) (C++26) |
반영된 타입이 주어진 인자 타입으로 (std::invoke로) 호출될 수 있는지 확인해요 (함수 템플릿) [edit] |
is_applicable_type, is_nothrow_applicable_type (C++26) (C++26) |
반영된 타입이 주어진 반영된 인자 튜플로 (std::invoke로) 호출될 수 있는지 확인해요 (함수) [edit] |
is_applicable, is_nothrow_applicable (C++26) (C++26) |
타입이 주어진 인자 튜플로 (std::invoke로) 호출될 수 있는지 확인해요 (클래스 템플릿) [edit] |
apply (C++17) |
인자 튜플로 함수를 호출해요 (함수 템플릿) [edit] |
apply_result (C++26) |
호출 가능한 객체를 주어진 인자 튜플로 호출했을 때의 결과 타입을 추론해요 (클래스 템플릿) [edit] |
declval (C++11) |
비평가 문맥에서 사용하기 위해 템플릿 타입 인자의 객체에 대한 참조를 얻어요 (함수 템플릿) [edit] |
더 알아보기 (Learn more)
cppreference