C++17嚐鮮:編譯期 if 語句
阿新 • • 發佈:2019-02-14
Constexpr If(編譯期 if 語句)
以 if constexpr 打頭的 if 語句被稱為 Constexpr If。
Constexpr If 是C++17所引入的新的語法特性。它為C++語言提供了在編譯期處理條件分歧的功能。
執行期 if 語句 | 預處理 if 語句 | 編譯期 if 語句 |
---|---|---|
if (condition) { statement; } else if (condition) { statement; } else { statement; } |
if condition statement; #elif condition statement; #else statement; #endif | if constexpr (condition) { statement; } else if constexpr (condition) { statement; } else { statement; } |
* 與執行期 if 語句有所不同,編譯期 if 語句中的判斷條件必須是編譯期常量。
* 與預處理期 if 語句有所不同,編譯期 if 語句中被丟棄的分支仍然需要進行語法檢查。
template <typename T>
auto get_value(T t) {
if constexpr (std::is_pointer_v<T>)
return *t; // deduces return type to int for T = int*
else
return t; // deduces return type to int for T = int
}
- std::is_pointer_v是一個編譯期的函式,判斷型別引數 T 是否指標型別,返回布林值。
- std::is_pointer_v 的返回值是一個編譯器常量,符合編譯期 if 語句的要求。
- get_value函式在編譯期檢查引數 t 的型別 T,如果 T 是指標型別,就返回 *t 否則返回 t 自身。
- 由於 get_value 函式可能返回兩種不同的型別,因此返回值型別必須用 auto,讓編譯器自行推導。