std::is_invocable, std::is_invocable_r, std::is_nothrow_invocable, std::is_nothrow_invocable_r
来自 cppreference.cn
定义于头文件 <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,或未知边界的数组,则行为未定义。
如果上述模板的实例化直接或间接依赖于不完整类型,并且该实例化在该类型假设完成时可能产生不同的结果,则行为未定义。
如果程序为此页上描述的任何模板添加特化,则行为未定义。
目录 |
[edit] 辅助变量模板
定义于头文件 <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 (public static 成员常量) |
成员函数
operator bool |
将对象转换为 bool,返回 value (公开成员函数) |
operator() (C++14) |
返回 value (公开成员函数) |
成员类型
类型 | 定义 |
value_type
|
bool |
类型
|
std::integral_constant<bool, value> |
[edit] 注意
特性测试宏 | 值 | 标准 | 特性 |
---|---|---|---|
__cpp_lib_is_invocable |
201703L |
(C++17) | std::is_invocable , std::invoke_result |
[edit] 示例
运行此代码
#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>); }
[edit] 参见
(C++17)(C++23) |
使用给定参数调用任何可调用对象并可能指定返回类型(从 C++23 开始) (函数模板) |
(C++11)(C++20 中已移除)(C++17) |
推导调用可调用对象与一组参数的结果类型 (类模板) |
(C++11) |
获取模板类型参数对象的引用,用于未求值上下文 (函数模板) |
(C++20) |
指定可调用类型可以使用给定的一组参数类型进行调用 (概念) |