C ++: Wie verwende ich type_traits, um festzustellen, ob eine Klasse trivial ist?

8

In C ++ 0x möchte ich feststellen, ob eine Klasse trivial ist / Standard-Layout hat, so dass ich memcpy (), memset (), etc ...

verwenden kann

Wie 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 kann

Bearbeiten: 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 ...

    
kfmfe04 02.10.2011, 05:03
quelle

2 Antworten

6

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.

    
Luc Danton 02.10.2011, 06:24
quelle
1

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.

    
Nicol Bolas 02.10.2011 05:20
quelle

Tags und Links