is_invocable、is_invocable_r、is_nothrow_invocable、is_nothrow_invocable_r 类

这些模板确定是否可以使用指定的参数类型调用类型。 is_invocable_ris_nothrow_invocable_r 还确定调用的结果是否可转换为特定类型。 is_nothrow_invocableis_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;

参数

Callable
要查询的可调用类型。

参数
要查询的参数类型。

敞篷车
Callable 的结果必须可转换为的类型

注解

如果可调用类型 Callable 可以在未求值的上下文中使用参数 Args 进行调用,则 is_invocable 类型谓词为 True

如果可调用类型 Callable 可以在未求值的上下文中使用参数 Args 进行调用以生成可转换为 Convertible 的结果类型,则 is_invocable_r 类型谓词为 True

如果可调用类型 Callable 可以在未求值的上下文中使用参数 Args 进行调用,并且已知这种调用不会引发异常,则 is_nothrow_invocable 类型谓词为 True

如果可调用类型 Callable 可以在未求值的上下文中使用参数 Args 进行调用以生成可转换为 Convertible 的结果类型,并且已知这种调用不会引发异常,则 is_nothrow_invocable_r 类型谓词为 True

每个 Convertible、Callable 类型和参数包 Args 中的类型都必须是完整类型、未知绑定的数组或可能 cv 限定的 void。 否则,谓词的行为是不明确的。

示例

// 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