„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie kann ich mit Vorlagenargumenten eine konstante Auswertung erreichen, wenn das Argument zum Zeitpunkt der Kompilierung nicht bekannt ist?

Wie kann ich mit Vorlagenargumenten eine konstante Auswertung erreichen, wenn das Argument zum Zeitpunkt der Kompilierung nicht bekannt ist?

Veröffentlicht am 20.11.2024
Durchsuche:501

How Can I Achieve Constant Evaluation with Template Arguments When the Argument Is Not Known at Compile Time?

Template Argument Constant Evaluation

1. Warum kann der Compiler „i“ nicht zur Kompilierungszeit auswerten?

Die Auswertung zur Kompilierungszeit erfordert, dass der Wert von „i“ bekannt ist, bevor das Programm ausgeführt wird. Im bereitgestellten Code ist „i“ jedoch eine Schleifenvariable, die sich während der Programmausführung ändert. Der Compiler kann den Wert von „i“ zur Kompilierungszeit nicht ermitteln, da es sich um einen dynamisch zugewiesenen Wert handelt.

2. Kann ich das Ziel erreichen, ohne die API-Schnittstelle zu ändern?

Ja, Sie können die Vorlagenspezialisierung verwenden, um eine rekursive Funktion zu erstellen, die den Bereich der Vorlagenargumente durchläuft. Sie könnten beispielsweise eine Funktion erstellen:

template
void modify_recursive() {
    // Call modify with template argument 'i'
    modify();
    
    // Recursively call modify_recursive with the next template argument
    if (i ();
    }
}

Aufrufen von „modify“ mit einem nicht konstanten Argument

Um „modify“ mit einem Wert aufzurufen, der keine Konstante zur Kompilierungszeit ist, können Sie a verwenden Technik namens Template-Metaprogrammierung. Ein Ansatz besteht darin, eine Vorlagenklasse zu erstellen, die ein Funktionsobjekt als Argument verwendet und es mit dem gewünschten Wert aufruft:

template
struct InvokeWithParam {
    InvokeWithParam(F f, int param) : f(f), param(param) {}
    
    void operator()() { f(param); }
    
    F f;
    int param;
};

Sie können dann eine Instanz von InvokeWithParam als Vorlagenargument übergeben, um Folgendes zu ändern:

int var = 5;
modify();

Dies ruft die Änderungsfunktion mit dem Wert von var auf.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3