Und anders als das Pi Beispiel, wie würde es mit nicht-const Variablen funktionieren?
Derzeit scheint es die Variablen für den Typ getrennt zu instanziieren. das heißt, Sie könnten 10 zu n<int>
zuweisen und es würde sich von der Vorlagendefinition unterscheiden.
template<typename T>
T n = T(5);
int main()
{
n<int> = 10;
std::cout << n<int> << " "; // 10
std::cout << n<double> << " "; // 5
}
Wenn die Deklaration const
lautet, wird sie nur gelesen. Wenn es ein constexpr
ist, wie alle constexpr
Deklarationen, hat es nicht viel außerhalb constexpr
(Resessions).
Abgesehen, dass wir diese Funktion nur durch eine variable Einwickeln in einer Templat-Struktur oder Klasse haben können, wie funktioniert diese Mischung mit Typ Conversions?
Es soll ein einfacher Vorschlag sein. Ich bin nicht in der Lage zu sehen, wie es sich auf Typkonvertierungen in signifikanter Weise auswirkt. Wie bereits erwähnt, ist der Typ der Variablen der Typ, mit dem Sie die Vorlage instanziiert haben. d.h. decltype(n<int>)
ist int. decltype((double)n<int>)
ist doppelt und so weiter.
Jedes Anwendungsbeispiel, um zu verstehen, wie man ein solches Feature optimal nutzt und wozu dient es?
N3651 bietet eine kurze Begründung.
Leider lassen vorhandene C++ - Regeln eine Vorlagedeklaration nicht zu deklarieren eine Variable. Es sind gut bekannt Abhilfen für dieses Problem:
• Verwendung constexpr statische Datenelemente der Klasse Vorlagen
• Verwendung constexpr Funktionsschablonen die gewünschten Werte Rückkehr
Diese Abhilfen für bekannt wurden Jahrzehnte und gut dokumentiert. Standardklassen wie std :: numeric_limits sind archetypische Beispiele. Obwohl diese Umgehungslösungen nicht perfekt sind, waren ihre Nachteile bis zu einem gewissen Grad tolerierbar, weil in der C++ 03 Ära nur einfache, eingebaute Typen Konstanten ungehindert direkten und effizienten kompilieren Zeitunterstützung genossen. All dies änderte sich mit der Einführung von constexpr-Variablen in C++ 11, die die direkte und effiziente -Unterstützung für Konstanten benutzerdefinierter Typen erweiterten. Jetzt sind Programmierer , die Konstanten (von Klassentypen) in Programmen mehr und mehr offensichtlich machen. So wachsen die Verwirrung und Frustrationen im Zusammenhang mit den Workarounds.
...
Die Hauptprobleme bei "statisches Datenelement" sind:
• sie "Duplikat" Erklärungen benötigen: einmal in der Klasse Vorlage, einmal außerhalb der Klassenvorlage, um die "echte" Definition zu liefern, falls die Konstanten odr-verwendet werden.
• Programmierer sind beide verärgert und verwirrt durch die Notwendigkeit, zweimal die gleiche Erklärung zu liefern. Im Gegensatz dazu benötigen "gewöhnliche" Konstanten-Deklarationen keine doppelten Deklarationen .
...
Bekannte Beispiele in dieser Kategorie sind wahrscheinlich statisches Element Funktionen von numeric_limits oder Funktionen wie boost::constants::pi<T>()
usw. constexpr Funktionen Vorlagen nicht leiden die " doppelte Deklarationen "geben Sie an, dass statische Datenelemente haben; Darüber hinaus bieten sie funktionale Abstraktion. Sie zwingen jedoch den Programmierer, im Voraus an der Definitionsseite zu wählen, wie die Konstanten geliefert werden sollen: entweder durch eine Konstante const oder durch plain non reference type.Wenn die Konstante const übergeben wird, müssen die Konstanten systematisch im statischen Speicher zugewiesen werden. Wenn vom Nicht-Referenztyp, müssen die Konstanten kopiert werden. Kopieren ist nicht ein Problem für Builttin-Typen, aber es ist ein Showstopper für benutzerdefinierte Typen mit Wert Semantik, die nicht nur Wrapper um winzige Built-In-Typen (zB Matrix oder Integer oder Bigfloat, etc.) sind Kontrast, "gewöhnliche" const (expr) Variablen leiden nicht unter diesem Problem. Es wird eine einfache Definition zur Verfügung gestellt, und die Entscheidung , ob die Konstanten tatsächlich nur im Speicherlayout ausgegeben werden müssen, hängt von der Verwendung ab, nicht von der Definition.
Der Vorschlag [N3651] (http://isocpp.org/files/papers/N3651.pdf) scheint viele dieser Informationen zu erfassen. –