if constexpr (condición) como condicional en tiempo de compilación
Quiero usar un constexpr bool (useF
en el ejemplo a continuación) para habilitar una función en el siguiente código. Aquí, llamandoA::f()
. Además, quiero ser la plantilla alias (a
) servoid
en el caso apago la función.
Intenté usar una declaración constexpr if, pero el cuerpo aún se está instanciando, lo que causa un error de compilación. Si uso una plantilla de contenedor (X
), el cuerpo está siendo descartado como esperaba, pero eso me parece feo. ¿Hay alguna otra forma de hacer esto?
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();
}
Estoy usando g ++ - 7.0.1 con -std = c ++ 17