C ++ 14 Variable Vorlagen: Was ist ihr Zweck? Irgendein Anwendungsbeispiel?
C++14 ermöglicht die Erstellung von Variablen Vorlagen. Das übliche Beispiel ist eine variable, 'pi', die gelesen werden können, um den Wert der mathematischen Konstante π für verschiedene Typen (3 int
; der nächste mögliche Wert mit float
usw.)
Außerdem können wir diese Funktion nur durch die Verpackung eine variable in eine vorgefertigte Struktur oder Klasse, wie wirkt sich dieser mix mit Typ-Konvertierungen? Ich sehe einige überschneidungen.
Und andere als die pi-Beispiel, wie es funktionieren würde mit non-const-Variablen? Jede Verwendung zu verstehen, wie man die die meisten von einer solchen Funktion und was Ihr Zweck ist?
Kommentar zu dem Problem - Öffnen
Der Vorschlag, N3651 scheint zu decken, eine Menge dieser Informationen.
InformationsquelleAutor der Frage jbgs | 2014-01-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Derzeit scheint es zu instanziieren von Variablen getrennt für den Typ. also, könnten Sie weisen 10 bis
n<int>
und es wäre anders, aus der template-definition.Wenn die Erklärung
const
es readonly ist. Wenn es einconstexpr
wie alleconstexpr
Erklärungen, es hat nicht viel Gebrauch außerhalbconstexpr
(ressions).Es soll einen einfachen Vorschlag. Ich bin nicht in der Lage, um zu sehen, wie es wirkt sich auf Typ-Konvertierungen in signifikanter Weise. Wie schon erwähnt, der Typ der Variablen ist der Typ, den Sie instanziiert die Vorlage mit. d.h.,
decltype(n<int>)
ist int.decltype((double)n<int>)
ist double und so weiter.N3651 bietet eine prägnante Begründung.
...
...
InformationsquelleAutor der Antwort
Ja, aber das wäre grundlose syntaktische Salz. Nicht gesund für den Blutdruck.
pi<double>
vermittelt die Absicht besser alspi<double>::value
. Kurz und auf den Punkt. Das ist Grund genug, in meinem Buch zu ermöglichen und Sie motivieren, diese syntax.InformationsquelleAutor der Antwort n.m.
Frage ich mich, ob etwas in diese Richtung wäre möglich: (vorausgesetzt die Verfügbarkeit der Vorlage lambdas)
Nun, ist das sinnvoll?
Als ein einfacher verwenden, beachten Sie, dass die Initialisierung von
pi<T>
verwendet explizite Konvertierung (explicit call mit einem einfachen Konstruktor) und nicht die einheitliche Initialisierung. Das bedeutet, dass, wenn ein Typradians
mit einem Konstruktorradians(double)
schreiben Siepi<radians>
.InformationsquelleAutor der Antwort Laurent LA RIZZA
Noch ein praktisches Beispiel für C++14 den Variablen Vorlagen, wenn Sie eine Funktion benötigen, die sich für die übergabe etwas in
std::accumulate
:Beachten Sie, dass die Verwendung
std::max<T>
ist unzureichend, weil es kann nicht ableiten, das genaue Signatur. In diesem besonderen Beispiel können Siemax_element
statt, aber der Punkt ist, dass es eine ganze Klasse von Funktionen, die die Freigabe dieses Verhalten.InformationsquelleAutor der Antwort Levi Morrison
Gut, können Sie verwenden Sie diese zu schreiben, kompilieren Sie code wie diesen:
Dies ist eine deutliche Verbesserung gegenüber dem gleichen
dass die Leute schreiben, ausführen, template metaprogramming, bevor die variable templates eingeführt wurden. Für nicht-Typ-Werte, waren wir in der Lage, dies zu tun, da C++11 mit
constexpr
, also template-Variablen haben nur den Vorteil, dass die Berechnungen basierend auf den Typen der Variablen Vorlagen.TL;DR: Sie lassen uns nicht zu tun, was wir vorher nicht tun konnte, aber Sie machen template metaprogramming weniger ein PITA.
InformationsquelleAutor der Antwort cmaster