Ich möchte ein conetexpr bool (useF
im Beispiel unten) verwenden, um eine Funktion in den folgenden Code zu aktivieren. Hier rufen Sie A::f()
. Außerdem möchte ich das Alias-Template (a
) als void
für den Fall sein, dass ich das Feature abschalt.Wenn conexpr (Bedingung) als Kompilierungszeit konditional
Ich habe versucht, eine constexpr if-Anweisung zu verwenden, aber der Rumpf wird immer noch instanziiert, was einen Kompilierungsfehler verursacht. Wenn ich eine Wrappervorlage verwende (X
), wird der Körper wie erwartet verworfen, aber das scheint mir hässlich zu sein. Gibt es andere Möglichkeiten, dies zu tun?
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();
}
ich verwende g ++ - 7.0.1 mit -std = C++ 17
Entschuldigung, es gab falsche Tags Auswahl! Wenn ich das Tag C++ 17 auswähle, wird ein Tag C++ 1z eingefügt ... seltsam. – wimalopaan
Weil es [Synonym] (http://stackoverflow.com/tags/c%2b%2b1z/synonyms) ist. – songyuanyao