static_assert
static_assert 是 C++11 中的一個關鍵字,用於在編譯時進行斷言檢查,如果條件不滿足,則將在編譯時產生錯誤。 這對於檢查程式碼的靜態不變條件或斷言非常有用, 特別是 tempalte 相關的 function.
主要精神
可以 compile 時檢查出來問題,盡量在 compile 時被檢查出來。這種問題修復所需的時間最少。 進入 runtime 後的問題,可能和外部資料、外部環境有關;即使你最後修改好了,也需要重新執行程式, 才可以確認自己的修復是否正確,必須花費大量的時間。 當然,如果你的 project 有寫單元測試,那也可以減少修復 bug 的時間。
不適合使用 static_assert 的一些例子 其實和 constexpr 一樣,都是 compile 時檢查,所以不適合的時機也一樣。
運行時動態決定的情況:
static_assert是在編譯時進行斷言檢查的,因此無法用於需要在運行時根據外部條件進行斷言檢查的情況。依賴外部狀態的情況: 如果需要斷言檢查的條件依賴於外部狀態的變化,例如系統狀態或使用者輸入,則無法在編譯時進行斷言檢查,因此不適合使用
static_assert。過於複雜的條件: 如果斷言檢查的條件過於複雜,無法在編譯時靜態計算得到,則
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;
}
結果

