Ich versuche eine Funktion zu schreiben, die, wenn sie mit Kompilierzeitkonstantenargumenten aufgerufen wird, einen Kompilierfehler auslöst, wenn der Wert des Arguments nicht ist passt nicht zu static_assert
, kann aber zur Laufzeit mit berechneten Werten aufgerufen werden.Erzeuge Fehler bei der Kompilierung, wenn der Parameter für die Kompilierzeitkonstante falsch ist
Etwas ein bisschen wie folgt aus:
template<int N> void f(N){
static_assert(N == 5, "N can only be 5.");
do_something_with(N);
}
void f(int N){
if(N == 5){
do_something_with(N);
}
}
volatile int five = 5;
volatile int six = 6;
int main() {
f(5); //ok
f(6); //compile-time error
f(five); //ok
f(six); //run-time abort
return 0;
}
Wie kann ich das tun? Wenn möglich, würde ich gerne die einfache Syntax f(something)
beibehalten können, da dieser Code für eine Bibliothek gedacht ist, die für Anfänger-Programmierer, die nicht vertraut mit Template-Syntax sind, verwendet werden sollte.
Werte, um als Parameter übergeben kann nicht, so dass die Linie 'Vorlage Leere f (N) abgeleitet werden { 'kann nicht korrekt sein –
Kompilierzeit oder Laufzeit. Sie müssen wählen (oder zwei Funktionen ausführen). – xinaiz
Gibt es eine Möglichkeit, es mit "constexpr" anstatt Vorlage Zeug zu tun? – AJMansfield