std::any
出自 cppreference.com
| 定義於標頭檔 <any> |
||
| class any; |
(自 C++17 起) | |
any 類別描述了一種型別安全的容器,用於存放任何可複製建構型別的單一值。
1)
any 類別的物件會儲存滿足建構要求之任意型別的實例,若無則為空,這被稱為 any 物件的狀態 (state)。儲存的實例稱為所包含的物件。若兩個狀態皆為空,或皆非空且所包含的物件相等,則稱這兩個狀態相等。2) 非成員函式
any_cast 提供了存取所包含物件的型別安全方式。建議實作方式避免對小型物件進行動態配置,但此類最佳化僅能應用於 std::is_nothrow_move_constructible 回傳 true 的型別。
目錄 |
[編輯] 成員函式
建構一個 any 物件(公開成員函式) | |
指派一個 any 物件(公開成員函式) | |
解構一個 any 物件(公開成員函式) | |
修改器 | |
| 變更所包含的物件,直接建構新物件 (公開成員函式) | |
| 解構所包含的物件 (公開成員函式) | |
交換兩個 any 物件(公開成員函式) | |
觀察器 | |
| 檢查物件是否持有值 (公開成員函式) | |
回傳所包含值對應的 typeid(公開成員函式) | |
[編輯] 非成員函式
| (C++17) |
特化 std::swap 演算法 (函式) |
| (C++17) |
存取所包含物件的型別安全方式 (函式模板) |
| (C++17) |
建立一個 any 物件(函式模板) |
[編輯] 輔助類別
| (C++17) |
當 any_cast 因型別不匹配而拋出的例外(類別) |
[編輯] 註解
| 功能測試巨集 | 數值 | 標準 | 功能 |
|---|---|---|---|
__cpp_lib_any |
201606L |
(C++17) | std::any
|
[編輯] 範例
執行此程式碼
#include <any> #include <iostream> int main() { std::cout << std::boolalpha; // any type std::any a = 1; std::cout << a.type().name() << ": " << std::any_cast<int>(a) << '\n'; a = 3.14; std::cout << a.type().name() << ": " << std::any_cast<double>(a) << '\n'; a = true; std::cout << a.type().name() << ": " << std::any_cast<bool>(a) << '\n'; // bad cast try { a = 1; std::cout << std::any_cast<float>(a) << '\n'; } catch (const std::bad_any_cast& e) { std::cout << e.what() << '\n'; } // has value a = 2; if (a.has_value()) std::cout << a.type().name() << ": " << std::any_cast<int>(a) << '\n'; // reset a.reset(); if (!a.has_value()) std::cout << "no value\n"; // pointer to contained data a = 3; int* i = std::any_cast<int>(&a); std::cout << *i << '\n'; }
可能輸出
int: 1 double: 3.14 bool: true bad any_cast int: 2 no value 3
[編輯] 參閱
| (C++11) |
任何可複製建構的可呼叫物件的可複製包裝器 (類別模板) |
| (C++23) |
任何在給定呼叫簽章中支援限定符的可呼叫物件的僅移動包裝器 (類別模板) |
| (C++17) |
一種型別安全的識別聯合體 (discriminated union) (類別模板) |
| (C++17) |
一個可能持有也可能不持有物件的封裝器 (類別模板) |