首頁>技術>

C++20(C++ 程式語言標準2020版)將是C++ 語言一次非常重大的更新。C++20 核心語言有四大特徵。

Concept(概念)

Concept其實已經不是什麼新東西了,在 C++ 11 還是 0x 的年代就已經有Concept的的概念了,屬於C++裡面喊了無數次狼來了的東西,C++在經歷了11/14/17,直到C++20才正式進入。

使用模板進行通用程式設計的關鍵思想是定義能透過各種型別使用的函式和類。但是在例項化模板時經常會出現用錯模板型別的問題,其結果通常是幾頁難懂的報錯資訊。

  template<typename T>concept  Integral = std::is_integral<T>::value;Integral auto Add(Integral auto a,Integral auto b){  return a + b;}//Integral 這個concept需要 std::is_integral::value 中的型別引數 T。//如果 std::is_integral::value 的值為 true,則沒有問題。如果不為 true,則你會收到一個編譯時間報錯。

概念讓你能為模板編寫要求,而編譯器則可以檢查這個要求,概念革新了我們思考和編寫通用程式碼的方式。原因如下:

模板是對模板類和函式的模板形參的約束,是介面的一部分;類模板中的函式過載或特殊化可以基於概念進行;編譯器能夠比較模板引數與實際的模板引數是否滿足concept,所以能得到更好的報錯資訊。

當然,這還不是全部,篇幅原因後續再講。

Ranges Library(範圍庫)

Ranges實際上可理解為一個Concept,它針對集合,提供begin()和end()兩個方法,返回一個指示類(iterator),然後就可以列舉集合中的所有元素。Range概念的出現,感覺上把集合類(容器類)的概念更抽象化(學術化)了,ranges庫中有許多Concept。它支援的演算法滿足以下條件:

可以直接在容器上操作;無需迭代器指定一個範圍;可以寬鬆地評估;可以組合

在STL使用上,大致有兩個不方便,一是大量應用iterator,二是集合操作寫法不直觀。

看下面示例程式碼(views是一種Range),沒有使用iterator,還讓集合操作也變得極為簡單了。

int main(){  auto const data {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};  auto result = data | std::views::remove_if([](int i) { return i % 2 == 0;}) );}// result = {1, 3, 5, 7, 9 };
int main(){  auto const  ints{0,1,2,3,4,5};  auto even=[](inti)									//判斷i是否偶數  {    return 0==i%2;  };  auto square=[](inti)               //計算i的平方  {    return i*i;  };  for( int i : ints | std::views::filter(even) | std::views::transform(square) )  {    std::cout<<i<<' ';              //輸出:0  4  16  }  std::cout<<std::endl;   for (int i : std::views::transform(std::views::filter(ints, even), square))  {    std::cout << i <<' ';          //輸出:0  4  16  }}

這程式碼行雲流水,實在忍不住要誇讚一番!

Coroutines(協程)

協程是廣義的函式,能在保持狀態的同時暫停或繼續。協程通常用來編寫事件驅動型應用。事件驅動型應用可以是模擬、遊戲、伺服器、使用者介面或演算法。協程也通常被用於協作式多工(cooperative multitasking)。

下方程式碼塊,函式 getNext 是一個協程,因為它使用了關鍵字 co_yield。generator是一個模板類(具體實現頗為複雜,程式碼量也較大後續單講);它有兩個方法gen有一個無限的迴圈,其會在 co_yield 之後返回 value(協程暫停)。呼叫 next()會繼續這個協程,接下來的 getValue 呼叫會獲取這個值。在 gen 呼叫之後,這個協程再一次暫停,其暫停會一直持續到下一次呼叫 next()。

template <typename T>class generator {}generator<int> gen(int start=0,int step=1){  auto value=start;  for(int i=0; ;++i)  {    co_yield value;     //返回value,協程暫停    value+=step;  }}int main(){  std::cout<<std::endl;  std::cout<<"gen():";  auto gen=gen();  for(inti=0;i<=10;++i)  {    gen.next();    //協程繼續    std::cout<<""<<gen.getValue();  }}
Module(模組)

Module的優點

沒有標頭檔案宣告實現仍然可分離, 但非必要可以顯式指定哪些(類, 函式等)匯出不需要標頭檔案重複引入宏 (include guards)模組之間名稱可以相同不會衝突模組只處理一次, 編譯更快 (標頭檔案每次引入都需要處理)預處理宏只在模組內有效模組引入順序無關緊要

建立模組cppcon,

// cppcon.cpp export module cppcon; namespace CppCon{     auto GetWelcomeHelper() {  return "Welcome to CppCon";  }     export auto GetWelcome() { return GetWelcomeHelper();}         //顯示指定GetWelcome匯出}

引用模組cppcon

// main.cpp import cppcon; int main(){     std::cout << CppCon::GetWelcome(); }

C++20的四大新特性內容其實還挺多的,本文旨在介紹四大特性說的是個什麼事,感興趣的朋友記得點關注,我會繼續做更詳細的講解。

7
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Python面向物件的基礎