Namespaces
Variants

std:: is_invocable, std:: is_invocable_r, std:: is_nothrow_invocable, std:: is_nothrow_invocable_r

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
(C++11)
(C++11)
(C++11)
is_invocable is_invocable_r is_nothrow_invocable is_nothrow_invocable_r
(C++17) (C++17) (C++17) (C++17)
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
Определено в заголовочном файле <type_traits>
template < class Fn, class ... ArgTypes >
struct is_invocable ;
(1) (начиная с C++17)
template < class R, class Fn, class ... ArgTypes >
struct is_invocable_r ;
(2) (начиная с C++17)
template < class Fn, class ... ArgTypes >
struct is_nothrow_invocable ;
(3) (начиная с C++17)
template < class R, class Fn, class ... ArgTypes >
struct is_nothrow_invocable_r ;
(4) (начиная с C++17)
1) Определяет, является ли INVOKE ( std:: declval < Fn > ( ) , std:: declval < ArgTypes > ( ) ... ) корректно сформированным, когда рассматривается как невычисляемый операнд.
2) Определяет, является ли INVOKE<R> ( std:: declval < Fn > ( ) , std:: declval < ArgTypes > ( ) ... ) корректно сформированным, когда рассматривается как невычисляемый операнд.
3) Определяет, является ли INVOKE ( std:: declval < Fn > ( ) , std:: declval < ArgTypes > ( ) ... ) корректно сформированным при рассмотрении как невычисляемый операнд и известно, что он не выбрасывает никаких исключений.
4) Определяет, является ли INVOKE<R> ( std:: declval < Fn > ( ) , std:: declval < ArgTypes > ( ) ... ) корректно сформированным при рассмотрении как невычисляемый операнд и известно, что не выбрасывает никаких исключений.

Если Fn, R или любой тип в пакете параметров ArgTypes не является полным типом, (возможно, cv-квалифицированным) void , или массивом неизвестной границы, поведение не определено.

Если создание экземпляра шаблона выше зависит, прямо или косвенно, от неполного типа, и это создание экземпляра может дать другой результат, если бы этот тип был гипотетически завершен, поведение не определено.

Если программа добавляет специализации для любых шаблонов, описанных на этой странице, поведение не определено.

Содержание

Вспомогательные шаблоны переменных

Определено в заголовочном файле <type_traits>
template < class Fn, class ... ArgTypes >

inline constexpr bool is_invocable_v =

std :: is_invocable < Fn, ArgTypes... > :: value ;
(1) (начиная с C++17)
template < class R, class Fn, class ... ArgTypes >

inline constexpr bool is_invocable_r_v =

std :: is_invocable_r < R, Fn, ArgTypes... > :: value ;
(2) (начиная с C++17)
template < class Fn, class ... ArgTypes >

inline constexpr bool is_nothrow_invocable_v =

std :: is_nothrow_invocable < Fn, ArgTypes... > :: value ;
(3) (начиная с C++17)
template < class R, class Fn, class ... ArgTypes >

inline constexpr bool is_nothrow_invocable_r_v =

std :: is_nothrow_invocable_r < R, Fn, ArgTypes... > :: value ;
(4) (начиная с C++17)

Унаследовано от std:: integral_constant

Константы-члены

value
[static]
true если (для перегрузки (1) ) INVOKE ( std:: declval < Fn > ( ) , std:: declval < ArgTypes > ( ) ... ) является корректным выражением при рассмотрении как невычисляемый операнд, false в противном случае
(public static member constant)

Функции-члены

operator bool
преобразует объект в bool , возвращает value
(public member function)
operator()
(C++14)
возвращает value
(public member function)

Типы-члены

Тип Определение
value_type bool
type std:: integral_constant < bool , value >

Примечания

Макрос тестирования возможностей Значение Стандарт Функция
__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>);
}

Смотрите также

(C++17) (C++23)
вызывает любой Callable объект с заданными аргументами с возможностью указания возвращаемого типа (since C++23)
(function template)
(C++11) (removed in C++20) (C++17)
выводит тип результата вызова вызываемого объекта с набором аргументов
(class template)
(C++11)
получает ссылку на объект шаблонного типа аргумента для использования в невычисляемом контексте
(function template)
определяет, что вызываемый тип может быть вызван с заданным набором типов аргументов
(concept)