命名空間
變體
動作

std::any

出自 cppreference.com
< cpp‎ | 工具
 
 
 
 
定義於標頭檔 <any>
class any;
(自 C++17 起)

any 類別描述了一種型別安全的容器,用於存放任何可複製建構型別的單一值。

1) any 類別的物件會儲存滿足建構要求之任意型別的實例,若無則為空,這被稱為 any 物件的狀態 (state)。儲存的實例稱為所包含的物件。若兩個狀態皆為空,或皆非空且所包含的物件相等,則稱這兩個狀態相等。
2) 非成員函式 any_cast 提供了存取所包含物件的型別安全方式。

建議實作方式避免對小型物件進行動態配置,但此類最佳化僅能應用於 std::is_nothrow_move_constructible 回傳 true 的型別。

目錄

[編輯] 成員函式

建構一個 any 物件
(公開成員函式) [編輯]
指派一個 any 物件
(公開成員函式) [編輯]
解構一個 any 物件
(公開成員函式) [編輯]
修改器
變更所包含的物件,直接建構新物件
(公開成員函式) [編輯]
解構所包含的物件
(公開成員函式) [編輯]
交換兩個 any 物件
(公開成員函式) [編輯]
觀察器
檢查物件是否持有值
(公開成員函式) [編輯]
回傳所包含值對應的 typeid
(公開成員函式) [編輯]

[編輯] 非成員函式

特化 std::swap 演算法
(函式) [編輯]
(C++17)
存取所包含物件的型別安全方式
(函式模板) [編輯]
(C++17)
建立一個 any 物件
(函式模板) [編輯]

[編輯] 輔助類別

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++17)
一種型別安全的識別聯合體 (discriminated union)
(類別模板) [編輯]
(C++17)
一個可能持有也可能不持有物件的封裝器
(類別模板) [編輯]
English Deutsch 日本語 中文(简体) 中文(繁體)