I want to use a constexpr bool (useF
in the example below) to enable a feature in the following code. Here, calling A::f()
. Additionally, I want to be the alias-template (a
) to be void
in the case I switch off the feature.
I tried to use a constexpr if statement, but the body is still being instantiated, which causes a compile error. If I use a wrapper template (X
), the body is being discarded as I'd expected, but that seems ugly to me. Are there any other ways to do this?
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();
}
I am using g++-7.0.1 with -std=c++17
See Question&Answers more detail:os