Tag | cxx

  1. C++ 17 Inline Variable

    Inline Variable(內嵌變數)是 C++ 17 新增的功能。Inline Variable 與 Inline Function(內嵌函式)相似,能讓我們在多個 Translation Unit(編譯單元)定義同樣的變數[1]。鏈結器(Linker)在處理多個 Object File(目的檔)的時候會再將名字相同的 Inline Variable 合併為一個變數。

    本文大綱:

    1. 動機 -- 介紹 C++ 標準新增 Inline Variable 的動機。
    2. Inline Variable -- 介紹 Inline Variable 的語法與注意事項。
    3. 替代方案 -- 介紹 C++ 17 以前 Inline …

    More

  2. C++ 17 constexpr 與 Lambda 表達式

    C++ 17 將 Lambda Expression 納入常數表達式(constexpr)的範疇,所以我們也能在只接受編譯期常數的地方呼叫 Lambda Expression 定義的 Lambda Function:

    void test() {
      auto f = [](int a, int b) constexpr {
        return a + b;
      };
      static_assert(f(1, 2) == 3, "");
    }
    

    本文會先回顧 C++ 11C++ 14 標準定義的 constexpr 再介紹 C++ 17 的改進。

    C++ 11 constexpr

    C++ 11 首次引入常數表達式 …

    More

  3. C++ 17 在 Lambda Expression 捕捉 *this

    如果一個成員函式(Member Function)有 Lambda Expression 而且該 Lambda Expression 有指定預設補捉模式(不論是傳值或傳參考)。當 Lambda Expression 內有程式碼指稱「成員函式」或「資料成員」時,this 會被隱含地加入 Capture List。Lambda Expression 在執行時會透過 this 指標存取成員函式或資料成員:

    #include <cassert>
    
    class Example {
    private:
      int value_;
    public:
      Example(int value = 0) : value_(value) {}
    
      void run() {
        auto f = [&]() { ++value_; };
        auto g = [=]() { ++value_ …

    More

  4. C++ 17 if constexpr 述句

    C++ 17 新增的 if constexpr 述句能讓我們用更簡潔的方式編寫樣版特化(Template Specialization)。本文會介紹它的語法與應用。

    語法

    if constexpr 述句的語法與一般的 if 述句相似。兩者的差異在於 if 關鍵字與刮號之間多了一個 constexpr 關鍵字:

    if constexpr ( condition ) then-statement

    if constexpr ( condition ) then-statement else else-statement

    其中,condition 必須是編譯期能確定數值的 constexpr 且該數值必須能被轉型為 boolconstexpr 包含以下常用的表達式:

    • <type_traits> 標頭檔定義的 Type Traits:
      • std::is_integral_v<T>
      • std::is_array_v<T>
      • std::is_reference_v …

    More

  5. C++ 17 類別樣版參數推導

    今天我想要介紹 C++ 17 的類別樣版參數推導(Class Template Argument Deduction)。在 C++ 17 之前,樣版參數推導(Template Argument Deduction)只會被施行於「函式樣版(Function Template)」。以 std::pair 為例,如果我們要呼叫 std::pair 的建構式創建一個 std::pair<double, int> 暫時物件,我們必須指定所有 std::pair 的樣版參數:

    std::pair<double, int>(5.0, 1)
    

    然而明確地指定樣版參數太過繁鎖,我們通常會另外定義一個函式樣版(Function Template …

    More

  6. C++ 17 折疊表達式

    C++ 11 引入了 Variadic Template,讓我們得以宣告任意個數的樣版參數。C++ 標準函式庫的 std::make_tuple 就是一個典型的例子:

    #include <tuple>
    
    int main() {
      auto a = std::make_tuple("a");
      auto b = std::make_tuple(1, "a");
      auto c = std::make_tuple(1.0, 1, "a");
    }
    

    如果我們想要編寫一個 sum() 函式累加所有的參數,我們該怎麼作呢?更具體的說,我們要怎麼改寫以下 sum() 函式,使它們能接收任意個數任意型別的參數:

    int sum(int x0 …

    More

  7. C++ 17 選擇述句與初始化述句

    C++ 98 程式語言標準將 if、switch、while 與 for 述句的文法依序定義為:

    if (condition) statement
    if (condition) statement else statement
    switch (condition) statement
    while (condition) statement
    for (for-init-statement conditionopt; expression) statement

    其中,我們能在 condition 宣告一個變數[1],並使用此變數的數值控制執行流程。例如:

    #include <cstdlib>
    #include <ctime>
    #include <iostream>
    
    int main() {
      std::srand(std::time(NULL));
    
      if …

    More

  8. C++ 17: 以 std::scoped_lock 避免 Dead Lock

    最佳化多執行緒程式時,為了減少非必要阻塞(Blocking),常見作法是將一個 Mutex 依照保護對象拆分為多個 Mutex。如此一來,一個執行緒只需鎖定它需要的 Mutex,不必等待它不需要的 Mutex。有時我們會進一步實作「並行資料結構(Concurrent Data Structure)」,將 Mutex 的保護對象縮小到資料結構的節點,讓多個執行緒能同時讀寫一個資料結構。

    然而,同時操作多個 Mutex 必需留意一些技術細節。舉例來說,以下程式碼有問題:

    #include <mutex>
    
    struct Node {
      std::mutex m;
      int data;
    };
    
    void swap(Node &lhs, Node &rhs) {
      if (&lhs == &rhs) return;
      std::lock_guard …

    More

  9. C++ 17 結構化綁定

    今天我想要介紹 C++ 17 新增的 Structured Binding(結構化綁定)。以 std::pair 為例,Structured Binding 能讓我們能直接將 std::pair 的內容綁定到我們指定的識別字:

    auto [a, b] = std::make_pair("str", 0);
    

    在這個例子𥚃,a 是型別為 const char *"str"b 是型別為 int0。換句話說,上面的程式碼相當於:

    const char *a = "str";
    int b = 0;
    

    這讓我們能簡化「接收 std::pair …

    More

  10. C++17: string_view、map 與異質比較查詢

    身為一個 C++ 程序員,我都會盡我所能避免不必要的計算。所以當我聽到 C++ 17 新增了 std::string_view 類別,我就迫不及待的想要使用它。std::string_view 的概念是:你可以指稱另一個 std::string 的一個子字串,但是不複製這段子字串。例如:

    std::string s("xxx yyy zz");
    std::string_view sv(s);
    std::string_view x(sv.substr(0, 3));  // x == "xxx"
    std::string_view y(sv.substr(4, 3));  // y == "yyy"
    std …

    More

Page 1 / 2 Next »