std::is_invocable, std::is_invocable_r, std::is_nothrow_invocable, std::is_nothrow_invocable_r
来自cppreference.com
<tbody>
</tbody>
| 在标头 <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 或未知边界数组,那么行为未定义。
如果上述模板的实例化直接或间接地依赖于不完整类型,并且假设在该类型完整的情况下实例化就会产生不同的结果,那么行为未定义。
如果程序添加了此页面上描述的任何模板的特化,那么行为未定义。
辅助变量模板
<tbody> </tbody>| 在标头 <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 [静态] |
如果 (对于重载 (1))INVOKE(std::declval<Fn>(), std::declval<ArgTypes>()...) 在被当做不求值操作数时为良构那么是 true,否则是 false (公开静态成员常量) |
成员函数
operator bool |
将对象转换到 bool,返回 value (公开成员函数) |
operator() (C++14) |
返回 value (公开成员函数) |
成员类型
| 类型 | 定义 |
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) |
以给定实参和可能指定的返回类型(C++23 起)调用任意可调用 (Callable) 对象 (函数模板) |
(C++11)(C++20 移除)(C++17) |
推导以一组实参调用一个可调用对象的结果类型 (类模板) |
(C++11) |
在不求值语境中获取到模板类型实参的对象的引用 (函数模板) |
(C++20) |
指定能以给定的一组实参类型调用的可调用类型 (概念) |