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) 确定是否能以参数
ArgTypes...
调用 Fn
。正式而言,确定 INVOKE(declval<Fn>(), declval<ArgTypes>()...)
在被当做不求值运算数时是否为良式,其中 INVOKE
是 可调用 (Callable) 中定义的运算。2) 确定是否能以参数
ArgTypes...
调用 Fn
并生成可转换为 R
的结果。正式而言,确定 INVOKE<R>(declval<Fn>(), declval<ArgTypes>()...)
在被当做不求值运算数时是否为良式,其中 INVOKE
是 可调用 (Callable) 中定义的运算。3) 确定是否能以参数
ArgTypes...
调用 Fn
(同 (1) ),并已知这种调用不抛任何异常。4) 确定是否能以参数
ArgTypes...
调用 Fn
并生成可转换为 R
的结果(同 (2) ),并已知这种调用(包括转换)不抛任何异常。Fn, R
与参数包 ArgTypes
中的所有类型应均为完整类型、(可为 cv 限定的) void ,或未知边界数组。否则行为未定义。
若上述模板的实例化直接或间接地依赖于不完整类型,并且如果假如使该类型完整,实例化就会产生不同的结果,则行为未定义。
添加此页面上描述的任何模板的特化的程序行为未定义。
辅助变量模板
定义于头文件 <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 [静态] |
若 INVOKE<R>(declval<Fn>(), declval<ArgTypes>()...) 在被当做不求值运算数时为良式 则为 true ,否则为 false (公开静态成员常量) |
成员函数
operator bool |
转换对象为 bool ,返回 value (公开成员函数) |
operator() (C++14) |
返回 value (公开成员函数) |
成员类型
类型 | 定义 |
value_type
|
bool
|
type
|
std::integral_constant<bool, value> |
示例
运行此代码
#include <type_traits> auto func2(char) -> int (*)() { return nullptr; } int main() { static_assert( std::is_invocable<int()>::value ); static_assert( std::is_invocable_r<int, int()>::value ); static_assert( std::is_invocable_r<void, void(int), int>::value ); static_assert( std::is_invocable_r<int(*)(), decltype(func2), char>::value ); }
参阅
(C++17)(C++23) |
以给定实参和可能指定的返回类型 (C++23 起)调用任意可调用 (Callable) 对象 (函数模板) |
(C++11)(C++20 中移除)(C++17) |
推导以一组实参调用一个可调用对象的结果类型 (类模板) |
(C++11) |
获取到其实参的引用,用于不求值语境中 (函数模板) |