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;
参数
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