c 17中的any模板類

2022-05-01 23:15:14 字數 1131 閱讀 6247

此外在c++17之前,各大類庫基本都提供了自己variant萬能類,c++17 標準庫引入any類可取代之,並提供更好的型別安全和效率。

any 類可以容納任意型別(可構造,複製)的值。用途目的之一可避免小物件的動態記憶體分配。例如在乙個陣列中存放基類及子類,實現基類多型訪問。

std::vectorobjs;

obj.emplace(new base);

obj.emplace(new child1);

obj.emplace(new child2);

現在可以直接在容器中存放any,從而避免了動態記憶體分配。

std::vectorobjs;

obj.emplace(base);

obj.emplace(child1);

obj.emplace(child2);

其他操作

//

test any, any is a class can containe any type

std::vectoranys;

anys.push_back(1);

anys.push_back(

2.0);

anys.push_back(std::wstring(l

"3.0

"));

anys.push_back(person);

//read

for (auto&val : anys)

else

if (val.type() == typeid(double

))

else

if (val.type() ==typeid(std::wstring)) }//

setstd::any any1;

std::wcout

<< std::any_cast(any1)

str1");

std::wcout

<< std::any_cast(any1)

(l"mike");

auto person;

std::wcout

<< static_cast(person) << std::endl;

C 17 之 利用建構函式推導模板引數型別

在 c 17 之前,通過向模板類的建構函式傳遞引數無法推導出類的模板引數型別.一般要通過乙個幫助函式來構造乙個物件,通過傳遞給幫助函式的引數推導出引數型別,然後在幫助函式中返回乙個構造好的物件.下面介紹 c 17 之前的做法與 c 17 的便利性.template class my class t2...

C 17嘗鮮 基於區間的for迴圈

c 11首次引入了基於區間 範圍 的for迴圈 range for for range declaration range expression loop statement其定義如下 和傳統for迴圈不同,這種基於區間的for迴圈可以在區間的元素上直接迭代 std vectorv for int ...

詳解C 17執行緒池的實現

首先介紹下類的宣告 class threadpool threadpool中只有三個函式,建構函式,析構函式以及乙個enqueue push任務佇列的函式 這些宣告看上去平淡無奇,但看到decltype auto 是不是有些懵?如果你不熟悉c 14可能是不會明白這是個啥東西。decltype是用來推...