此外在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是用來推...