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,或未知邊界的陣列,則行為未定義。
如果上述模板的例項化直接或間接依賴於不完整型別,並且該例項化在該型別假設完成時可能產生不同的結果,則行為未定義。
如果程式為此頁上描述的任何模板新增特化,則行為未定義。
目錄 |
[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) |
指定可呼叫型別可以使用給定的一組引數型別進行呼叫 (概念) |