Home Item 10 - static_assert (中文)
Post
Cancel

Item 10 - static_assert (中文)

static_assert

static_assert 是 C++11 中的一個關鍵字,用於在編譯時進行斷言檢查,如果條件不滿足,則將在編譯時產生錯誤。 這對於檢查程式碼的靜態不變條件或斷言非常有用, 特別是 tempalte 相關的 function.

主要精神

可以 compile 時檢查出來問題,盡量在 compile 時被檢查出來。這種問題修復所需的時間最少。 進入 runtime 後的問題,可能和外部資料、外部環境有關;即使你最後修改好了,也需要重新執行程式, 才可以確認自己的修復是否正確,必須花費大量的時間。 當然,如果你的 project 有寫單元測試,那也可以減少修復 bug 的時間。

不適合使用 static_assert 的一些例子 其實和 constexpr 一樣,都是 compile 時檢查,所以不適合的時機也一樣。

  1. 運行時動態決定的情況: static_assert 是在編譯時進行斷言檢查的,因此無法用於需要在運行時根據外部條件進行斷言檢查的情況。

  2. 依賴外部狀態的情況: 如果需要斷言檢查的條件依賴於外部狀態的變化,例如系統狀態或使用者輸入,則無法在編譯時進行斷言檢查,因此不適合使用static_assert

  3. 過於複雜的條件: 如果斷言檢查的條件過於複雜,無法在編譯時靜態計算得到,則static_assert 無法使用。它只能用於在編譯時靜態計算的簡單條件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <typename T>
void process_data(T data) {
    static_assert(std::is_integral<T>::value, "只能處理整數型別");

    // 處理整數型別的資料
    std::cout << "資料處理中..." << std::endl;
}

int main()
{
    process_data(5);  // 正確,因為參數是整數型別
    process_data(1.1);  // 錯誤,因為參數是浮點數型別,將導致 static_assert 失敗

    return 0;
}

結果

Desktop View

☝ツ☝

This post is licensed under CC BY 4.0 by the author.

👈 ツ 👍