[英]if constexpr(condition) as compile-time conditional
我想使用 constexpr bool(下面示例中的useF
)來啟用以下代碼中的功能。 在這里,調用A::f()
。 此外,我想在我關閉該功能的情況下成為void
的別名模板( a
)。
我嘗試使用 constexpr if 語句,但主體仍在被實例化,這會導致編譯錯誤。 如果我使用包裝器模板 ( X
),則正文將按我的預期被丟棄,但這對我來說似乎很難看。 有沒有其他方法可以做到這一點?
constexpr bool useF = false;
struct A {
static void f() {}
};
using a = std::conditional<useF, A, void>::type;
template<typename L>
struct X {
static void h() {
if constexpr(std::is_same<L, A>::value) {
L::f(); // not instantiated, no error
}
}
};
int main() {
if constexpr(useF) {
a::f(); // error!?
}
X<a>::h();
}
我使用 g++-7.0.1 和 -std=c++17
if constexpr
僅用於模板。 來自 [stmt.if]:
如果
if
語句的形式為if constexpr
,則條件的值應為bool
(5.20) 類型的上下文轉換常量表達式; 這種形式稱為constexpr if語句。 如果轉換條件的值為false
,則第一個子語句是丟棄的語句,否則第二個子語句(如果存在)是丟棄的語句。 在封閉模板化實體的實例化期間(第 14 條) ,如果條件在實例化后不依賴於值,則不會實例化丟棄的子語句(如果有)。
在X
, constexpr if 語句將阻止其他格式錯誤的語句被實例化。 這就是此語言功能的目標。 但是在模板之外,沒有這樣的等效增益。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.