Wie kann ich erreichen, sizeof Vektor::value_type?
Ich will sizeof
des Typs, das ist enthalten in einem Vektor. Hier ist, was ich versucht habe:
#include <iostream>
#include <vector>
int main()
{
std::vector<uint> vecs;
std::cout << sizeof(vecs.value_type) << std::endl;
return 0;
}
Aus meinem Verständnis sollte dies richtig sein. Jedoch beim kompilieren mit GCC 4.8.1 dies ist, was ich bekomme:
test-sizeof.cpp: In function 'int main()': test-sizeof.cpp:7:27: Fehler: ungültige Verwendung von 'std::vector<unsigned int>::value_type' std::cout << sizeof(vecs.value_type) << std::endl; ^
Was mache ich falsch? Wie kann ich die Größe der enthaltenen Typ?
- Verwenden
std::vector<uint>::value_type
sizeof(std::vector<uint>::value_type)
odersizeof(decltype(vecs)::value_type)
.- Danke, das decltype trick ist, was ich benutzt habe. Wenn Sie die Zeit finden können Sie bitte eine detaillierte Erklärung, was ist hier Los? Ich denke, ich habe eine vage Idee, aber nicht genug, dass ich vielleicht erklären es im detail.
- Warum nicht einfach
sizeof(vecs[0])
? - Würde das funktionieren, auch wenn der Vektor keine Elemente?
- Ja, weil der operand wird nicht ausgewertet. (Ja ich bin zu spät. :|)
Du musst angemeldet sein, um einen Kommentar abzugeben.
3.4.3 Qualifizierte name lookup [basic.lookup.qual]
In diesem Fall greifen Sie auf einen
type
Mitglied von der Vorlage-Klasse-Spezialisierungstd::vector<uint>
, und Sie müssen es tun, indem er schreibt:In Fall, dass Sie eigentlich in Vorlagen-code und wollen, um z.B. den Zugriff auf die gleichen verschachtelten Art, müssen Sie Präfix mit dem Schlüsselwort
typename
wie diese:In C++11, können Sie
sizeof(decltype(vecs)::value_type)
oder auchsizeof(decltype(vecs.back()))
letzteres ist praktisch, wenn Sie nicht wissen, die genaue Bezeichnung der Art aber wissen, wie der Zugang zu Ihnen durch eine member-Funktion wieback()
.Hinweis: wie bereits von @Casey in die Kommentare,
decltype
erfordert Strippen Referenzen um, um den Typ selbst, sondern auch für sizeof Zwecke, spielt keine Rolle..
und->
können verwendet werden, um Zugriffstatic
Mitglieder-Daten oder-Funktionen, die Klasse Mitglieder. Es kann einfach nicht sein verwendet, um Zugriff auf einen Typ..
.decltype(vecs.back())
istdecltype(vecs)::value_type&
und erfordert Strippen mitstd::remove_reference
oderstd::decay
man die Reine geben.sizeof()
Zwecke, ist das nicht nötig. Aktualisiert wenn.decltype(vecs)::value_type
wird nicht funktionieren, wennvecs
ist einstd::vector<T>&
. Es ist notwendig, um die noch komplizierterstd::remove_reference_t<decltype(vecs)>::value_type
.sizeof()
übergeben werden können, einen Ausdruck, nicht nur ein geben, es ist nicht notwendig, umdecltype()
zu drehen, einen Ausdruck in seine Art. E. g.,sizeof('x')
gültig ist, wie es ist, gibt es keine Notwendigkeit zu schreibensizeof(decltype('x'))
. Dies führt zu dem, was ich denke, ist die beste Antwort auf die ursprüngliche Frage. Holen Sie sich die Größe mitsizeof(vecs[0])
. Es ist völlig sicher zu verwendenstd::vector::operator[]
in diesem ungewichtete Kontext. Es ist sehr präzise und es funktioniert für Vektoren und andere Container, und auch C-arrays oder Zeiger. E. g., in einer Vorlage, wo die Art dervecs
könnte sich viele Dinge, außer vector.Den member-access operator
.
können nur verwendet werden, um Zugriff auf Datenelemente und member-Funktionen von Klassen, nicht auf andere geschachtelten Namen wie Typ-Namen. Sie müssen den bereichsauflösungsoperator::
Zugang zu Ihnen, und das kann nur angewendet werden, um den Namen der Klasse (oder ein alias), nicht ein Objekt der Klasse Typ:In C++11 oder später
decltype
können, geben Sie einen Namen eingeben, wenn Sie ein Objekt haben und keine bequemen Zugang zu den Typ:E2
ist ein nested type, der AusdruckE1.E2
ist schlecht ausgebildet."Den Kommentaren so ziemlich alles gesagt: wenn Sie wissen, die Art der Vektor, die Sie verwenden können
sizeof(std::vector<uint>::value_type)
. Ansonsten verwenden Siesizeof(decltype(vecs)::value_type)
.decltype
ist ein Magischer C++11-Konstrukt ausgewertet wird, um den Typ des Arguments, also der codeIst das gleiche wie
Verwenden Sie nur die
.
- operator für Felder und Methoden (technisch, es kann verwendet werden für statische variable als gut, aber es gilt als schlechte Praxis). Für alles andere, wie zum Beispiel statische Variablen, innere Klassen, oder Klassen-scope-template-Parameter oder Typdefinitionen (wievalue_type
), verwenden Sie den scope-resolution-operator::
.Ich lieber präziser:
Die auf den ersten Blick scheint unsicher denn was passiert, wenn
vecs
wird eine Länge von null-Vektor?Für dieses Beispiel, wo das argument zu
sizeof()
Bediener wird aufgefordert, den Wert-Typ, dersizeof()
- operator ausgeführt wird zur compile-Zeit und sovecs[0]
können nie dazu führen, einen segfault oder Absturz.p.s.
sizeof()
ist nur zur Laufzeit ausgewertet, wenn das argument ist ein variable-Länge-array (aus C oder GNU-C++ - Erweiterung)