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 [静态] |
如果 (对于重载 (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) |
指定能以给定的一组实参类型调用的可调用类型 (概念) |