классы is_invocable, is_invocable_r, is_nothrow_invocable, is_nothrow_invocable_r

Эти шаблоны определяют, можно ли вызывать тип с указанными типами аргументов. is_invocable_r а is_nothrow_invocable_r также определите, преобразуется ли результат вызова в конкретный тип. is_nothrow_invocable а is_nothrow_invocable_r также определите, не вызывает ли вызов исключения. Добавлено в C++17.

Синтаксис

template <class Callable, class... Args>
struct is_invocable;

template <class Convertible, class Callable, class... Args>
struct is_invocable_r;

template <class Callable, class... Args>
struct is_nothrow_invocable;

template <class Convertible, class Callable, class... Args>
struct is_nothrow_invocable_r;

// Helper templates
template <class Callable, class... Args>
inline constexpr bool is_invocable_v =
    std::is_invocable<Callable, Args...>::value;

template <class Convertible, class Callable, class... Args>
inline constexpr bool is_invocable_r_v =
    std::is_invocable_r<Convertible, Callable, Args...>::value;

template <class Callable, class... Args>
inline constexpr bool is_nothrow_invocable_v =
    std::is_nothrow_invocable<Callable, Args...>::value;

template <class Convertible, class Callable, class... Args>
inline constexpr bool is_nothrow_invocable_r_v =
    std::is_nothrow_invocable_r<Convertible, Callable, Args...>::value;

Параметры

Вызываемые
Вызываемый тип для запроса.

Args
Типы аргументов для запроса.

Кабриолет
Тип результата вызываемого объекта должен быть преобразован в.

Замечания

Предикат is_invocable типа имеет значение true, если вызываемый тип Callable можно вызвать с помощью аргументов Args в неоценимом контексте.

Предикат is_invocable_r типа имеет значение true, если вызываемый тип Callable можно вызвать с помощью аргументов Args в неоценимом контексте для создания типа результата, преобразуемого в Convertible.

Предикат is_nothrow_invocable типа имеет значение true, если вызываемый тип Вызываемого типа можно вызвать с помощью аргументов Args в неоценимом контексте, и что такой вызов, как известно, не вызывает исключение.

Предикат is_nothrow_invocable_r типа имеет значение true, если вызываемый тип Вызываемого типа можно вызвать с помощью аргументов Args в неоценимом контексте для создания типа результата, преобразуемого в Convertible, и что такой вызов, как известно, не вызывает исключение.

Каждый из типов Convertible, Callable и типы в пакете параметров Args должны быть полным типом, массивом неизвестных границ или, возможно, квалифицированным voidcv. В противном случае поведение предиката не определено.

Пример

// std__type_traits__is_invocable.cpp
// compile using: cl /EHsc /std:c++17 std__type_traits__is_invocable.cpp
#include <type_traits>

auto test1(int) noexcept -> int (*)()
{
    return nullptr;
}

auto test2(int) -> int (*)()
{
    return nullptr;
}

int main()
{
    static_assert( std::is_invocable<decltype(test1), short>::value );

    static_assert( std::is_invocable_r<int(*)(), decltype(test1), int>::value );
    static_assert( std::is_invocable_r<long(*)(), decltype(test1), int>::value ); // fails

    static_assert( std::is_nothrow_invocable<decltype(test1), int>::value );
    static_assert( std::is_nothrow_invocable<decltype(test2), int>::value ); // fails

    static_assert( std::is_nothrow_invocable_r<int(*)(), decltype(test1), int>::value );
    static_assert( std::is_nothrow_invocable_r<int(*)(), decltype(test2), int>::value ); // fails
}

Требования

Заголовок:<type_traits>

Пространство имен: std

См. также

<type_traits>
invoke