std::is_invocable, std::is_invocable_r, std::is_nothrow_invocable, std::is_nothrow_invocable_r
来自 cppreference.com
定义在头文件 <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 = |
(1) | (自 C++17 起) |
template< class R, class Fn, class... ArgTypes > inline constexpr bool is_invocable_r_v = |
(2) | (自 C++17 起) |
template< class Fn, class... ArgTypes > inline constexpr bool is_nothrow_invocable_v = |
(3) | (自 C++17 起) |
template< class R, class Fn, class... ArgTypes > inline constexpr bool is_nothrow_invocable_r_v = |
(4) | (自 C++17 起) |
从 std::integral_constant 继承
成员常量
value [静态] |
true 如果(对于重载 (1))INVOKE(std::declval<Fn>(), std::declval<ArgTypes>()...) 在被视为非求值操作数时形成良好,false 否则 (公共静态成员常量) |
成员函数
operator bool |
将对象转换为 bool,返回 value (公共成员函数) |
operator() (C++14) |
返回 value (公共成员函数) |
成员类型
类型 | 定义 |
value_type
|
bool |
type
|
std::integral_constant<bool, value> |
[编辑] 说明
功能测试 宏 | 值 | Std | 功能 |
---|---|---|---|
__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 对象 并可以选择指定返回类型(自 C++23 起) (函数模板) |
(C++11)(在 C++20 中移除)(C++17) |
推断用一组参数调用可调用对象的结果类型 (类模板) |
(C++11) |
获取对模板类型参数对象的引用,用于未评估的上下文中 (函数模板) |
(C++20) |
指定可调用类型可以用给定的一组参数类型调用 (概念) |