types_is_invocable

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