Ich habe einen Code wie
template <size_t N>
class A
{
template <size_t N>
someFunctions() {};
};
Jetzt möchte ich Instanzen der Klasse erstellen und die darin enthaltenen Funktionen in einer for-Schleife für eine Reihe von Werten wie aufrufen
// in main()
int main()
{
for (int i = 1; i <= 100; i++)
{
const int N = i; // dont know how to do this
A<N> a;
a.functionCalls();
}
}
Wie macht man das? Ich hoffe auf eine Methode, um dies zu tun.
c++
for-loop
templates
compile-time-constant
template-classes
Nachiappan Venkatesh
quelle
quelle
N
muss diesconstexpr
der Fall sein , wenn es sich um eine Schleifenvariable handelt, die nicht der Fall istAntworten:
Dies würde etwas erfordern, das als a bezeichnet
template for
wird. Dies ist die erwartete Form, die Erweiterungsanweisungen annehmen. Dies sieht aus wie eine for-Schleife, ist jedoch in Wirklichkeit ein Vorlagenblock in einer Funktion, die mehrfach instanziiert wird.Natürlich gibt es eine Problemumgehung. Wir können generische Lambdas missbrauchen, um eine Art lokalen Vorlagenblock zu deklarieren und ihn selbst zu instanziieren:
Diese Funktion nimmt eine ganzzahlige Sequenz und instanziiert das Lambda
F
so oft wie die Länge der Sequenz.Es wird so verwendet:
Hier
N
kann als Vorlagenparameter gesendet werden, da es sich um ein Objekt handelt, das einen Constexpr-Konvertierungsoperator in einen Integer-Typ hat. Genauer gesagt, es ist einstd::integral_constant
mit zunehmendem Wert.Live Beispiel
quelle
static_cast<void>
?f
einen Typ zurückgibt, der den Kommaoperator überlastettemplate for
. Der Missbrauch solcher Sprachkonstrukte ist immer schmerzhafterDie
N
Kompilierzeit muss konstant sein, was bei einer normalenfor
Schleife nicht möglich ist.Es gibt jedoch viele Problemumgehungen. Inspiriert von diesem SO-Beitrag können Sie beispielsweise Folgendes tun. ( Siehe eine Live-Demo )
Druckt
1
auf100
In c ++ 17 kann das Obige
AGenerator
mithilfe von auf eine einzelne Vorlagenklasse reduziert werden (dh eine Spezialisierung kann vermieden werden)if constexpr
. ( Siehe eine Live-Demo )Ausgabe :
Wenn Sie den Iterationsbereich bereitstellen möchten, können Sie Folgendes verwenden. ( Siehe eine Live-Demo )
Gibt die gleiche Ausgabe wie in der obigen Version aus.
quelle
Ab C ++ 20 können Sie Vorlagen-Lambdas verwenden, sodass Sie Folgendes ausprobieren können
Das Folgende ist ein vollständiges Kompilierungsbeispiel, das alle Zahlen von 0 bis 99 druckt
quelle
Eine Möglichkeit, dies zu tun, ist die Meta-Programmierung von Vorlagen mit etwa der folgenden Funktion:
quelle
Nur der Vollständigkeit halber - ist es wirklich erforderlich, dass die Klasse oder Funktion als Vorlage verwendet wird, wenn die einzige Verwendung der Funktion aus der Schleife aufgerufen werden soll?
Wenn ja und Sie nicht von Hand schreiben möchten, schauen Sie sich boost.hana an.
quelle