if constexpr(condition) 作为编译时条件
if constexpr(condition) as compile-time conditional
我想使用 constexpr bool(下例中的 useF
)来启用以下代码中的功能。这里,调用A::f()
。此外,如果我关闭该功能,我想将别名模板 (a
) 设为 void
。
我尝试使用 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 the if
statement is of the form if constexpr
, the value of the condition shall be a contextually converted constant expression of type bool
(5.20); this form is called a constexpr if statement. If the value of
the converted condition is false
, the first substatement is a discarded statement, otherwise the second substatement, if present, is a discarded statement. During the instantation of an enclosing templated entity
(Clause 14), if the condition is not value-dependent after its instantiation, the discarded substatement (if any) is not instantiated.
在 X
中,constexpr if 语句将阻止格式错误的语句被实例化。这就是该语言功能的目标。但是在模板之外,没有这样的等效增益。
我想使用 constexpr bool(下例中的 useF
)来启用以下代码中的功能。这里,调用A::f()
。此外,如果我关闭该功能,我想将别名模板 (a
) 设为 void
。
我尝试使用 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 the
if
statement is of the formif constexpr
, the value of the condition shall be a contextually converted constant expression of typebool
(5.20); this form is called a constexpr if statement. If the value of the converted condition isfalse
, the first substatement is a discarded statement, otherwise the second substatement, if present, is a discarded statement. During the instantation of an enclosing templated entity (Clause 14), if the condition is not value-dependent after its instantiation, the discarded substatement (if any) is not instantiated.
在 X
中,constexpr if 语句将阻止格式错误的语句被实例化。这就是该语言功能的目标。但是在模板之外,没有这样的等效增益。