1. 程式人生 > >C++17標準庫std::any

C++17標準庫std::any

定義在any標頭檔案中:#include <any>
是一個可用於任何型別單個值的型別安全的容器.

使用方法

#include <any>
#include <iostream>

int main() {
	// 儲存任意型別的單個值
	// 成員函式type():返回容器中的值的型別
	// 非成員函式std::any_cast<T>():強制型別轉換
	std::any a = 1;
	std::cout << a.type().name() << ": " << std::any_cast<
int>(a) << '\n';// i: 1 a = 3.14; std::cout << a.type().name() << ": " << std::any_cast<double>(a) << '\n';// d: 3.14 // bad_any_cast try { a = 1; std::cout << std::any_cast<float>(a) << '\n'; } catch (const std::bad_any_cast& a) { std:
:cout << e.what() << '\n';// bad any_cast } // has_value: 是否有值 any a = 1; if (a.has_value()) { std::cout << a.type().name() << std::endl;// i } // reset:清空容器 a.reset(); if (a.has_value()) { std::cout << "no value\n";// no value } // pointer to contained data a = 1
; int* i = std::any_cast<int>(&a);// 這裡有點奇怪 std::cout << *i << '\n';// 1 }

總結:

  • std::any a = 1;: 宣告一個any型別的容器,容器中的值為int型別的1
  • a.type(): 得到容器中的值的型別
  • std::any_cast<int>(a);: 強制型別轉換, 轉換失敗可以捕獲到std::bad_any_cast型別的異常
  • has_value(): 判斷容器中是否有值
  • reset(): 刪除容器中的值
  • std::any_cast<int>(&a): 強制轉換得到容器中的值的地址