std::any
來自 cppreference.com
定義於標頭檔案 <any> |
||
class any; |
(C++17 起) | |
any
類描述了一個型別安全的容器,用於儲存任意可複製構造型別的單個值。
1)
any
類的物件儲存滿足建構函式要求的任何型別例項,或者為空,這被稱為 any
物件的*狀態*。儲存的例項被稱為所包含的物件。如果兩個狀態都為空,或者都非空且所包含的物件等價,則這兩個狀態等價。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) |
一種型別安全的帶判別聯合體 (類模板) |
(C++17) |
可能包含或不包含物件的包裝器 (類模板) |