In C ++ 0x möchte ich feststellen, ob eine Klasse trivial ist / Standard-Layout hat, so dass ich memcpy (), memset (), etc ...
verwenden kannWie soll ich den folgenden Code mit type_traits implementieren, damit ich bestätigen kann, dass ein Typ trivial ist?
%Vor%HINWEIS: is_pod () ist zu restriktiv: Ich möchte, dass meine Klasse triviale Konstruktoren hat, usw. ... aus Gründen der Bequemlichkeit.
Hinzugefügt: Ich denke std :: is_standard_layout & lt; & gt; Kann mir geben, wonach ich suche. 1. Wenn ich Konstruktoren hinzufüge, gibt es immer noch wahr zurück 2. Wenn ich eine virtuelle Methode hinzufüge, wird false zurückgegeben Dies ist, was ich feststellen muss, wenn ich memcpy (), memset ()
verwenden kannBearbeiten: Von Luc Danton Erklärung und Link unten (Klarstellung):
%Vor%Damit memcpy () glücklich ist:
%Vor%So sieht es aus wie is_trivial_class & lt; & gt; ist richtig: is_standard_layout & lt; & gt; ist nicht unbedingt richtig ...
Für std::memcpy
ist es ausreichend, dass der Typ trivial kopierbar ist. Von n3290, 3.9 Typen [basic.types] Absatz 2:
Für jedes Objekt (außer einem Unterobjekt der Basisklasse) des trivial kopierbaren Typs T kann, ob das Objekt einen gültigen Wert vom Typ T enthält oder nicht, die dem Objekt zugrunde liegenden Bytes (1.7) in ein Array kopiert werden von char oder unsigned char.
Die folgenden Abschnitte beschreiben auch andere nützliche Eigenschaften von trivial kopierbaren Typen (d. h. nicht nur Kopieren in ein char
-Array).
std::is_trivially_copyable
ist die Eigenschaft, genau das zu erkennen. Zum Zeitpunkt meines Schreibens wird es jedoch nicht von z.B. GCC, also sollten Sie std::is_trivial
als Fallback verwenden (da es wiederum einen trivialen Kopierkonstruktor benötigt).
Ich empfehle wirklich nicht, is_standard_layout
zu verwenden, es sei denn, Sie wissen wirklich, was Sie tun (z. B. Sprachinteroperabilität auf einer bestimmten Plattform). Es ist nicht das, was Sie wollen. Weitere Informationen zu der Frage, welche Trivialitäten und Standard-Layouts Ihnen dabei helfen könnten, die genaue Anforderungen, die Sie wollen.
Die Definition von POD in C ++ 11 lautet:
Eine POD-Struktur ist eine nicht geteilte Klasse, die sowohl eine triviale Klasse als auch eine Standardlayoutklasse ist und keine nicht statischen Datenelemente vom Typ Nicht-POD-Struktur, Nicht-POD-Vereinigung (oder Array solcher Typen) aufweist ).
Wenn Sie also nicht gegen die Regeln des Standardlayouts oder etwas Ähnliches verstoßen, sollte is_pod
ausreichen. Wenn Sie die Regeln des Standardlayouts nicht einhalten, können Sie memcpy
und memset
nicht verwenden usw.
Also ich weiß nicht, warum Sie das brauchen, es sei denn, Sie versuchen, Trivialität speziell zu testen.
Tags und Links c++ c++11 typetraits pod