Bedingt trivialer Destruktor

9

Eine diskriminierte union / getaggte Variante erfinden Ich komme zu dem Schluss, dass ein Feature wie "make destructor trivial unter bestimmten Bedingungen zur Kompilierzeit" besonders wichtig ist. Ich meine eine Art von SFINAE oder so etwas wie (Pseudocode):

%Vor%

Dies bedeutet, dass wenn die Bedingung in default(*) true ist, die Definition von destructor gleich ~X() = default; ist, aber wenn es false ist, wird stattdessen { // ... } body verwendet.

%Vor%

In diesem Beispiel, um der Klasse U einen Literaltyp zu geben (im Falle von first, rest... sind alle einfach zerstörbar), ist es möglich, fast das gleiche wie U class ( V ) zu definieren, aber ohne Definition eines Destruktors ~U (dh ist ein Literaltyp, wenn alle absteigenden Typen Literale sind). Definieren Sie dann Vorlagen-Alias ​​

%Vor%

und definieren using tail = W< rest... >; in U und V neu. Daher gibt es zwei fast identische Klassen, unterscheidet sich nur in Anwesenheit von Destruktor. Der obige Ansatz erfordert eine übermäßige Vervielfältigung von Code.

Das Problem betrifft auch das triviale Kopieren / Verschieben von zuweisbaren Typen und operator = und auch alle anderen Bedingungen für den Typ std::is_trivially_copyable . 5 Bedingungen ergeben insgesamt 2 ^ 5 Kombinationen zur Implementierung .

Gibt es irgendwelche gebrauchsfertige Techniken (und weniger wortreich, dann oben beschrieben), die im gegenwärtigen C ++ ausgedrückt werden können, die ich vermisse, oder vielleicht bald kommen Vorschlag ?

Ein weiterer denkbarer Ansatz ist (Sprachfunktion), um den Destruktor als constexpr zu markieren und dem Compiler zu gewähren, um zu testen, ob der Körper während der Instantiierung gleich trivial ist oder nicht.

UPDATE:

Vereinfachter Code wie in den Kommentaren angegeben: union wurde zu union -like class. % Co_de% specifiers wurde entfernt.

    
Orient 17.06.2015, 05:09
quelle

1 Antwort

1

Bedingter Destruktor kann über zusätzliche Zwischenebene mit Template-Spezialisierung implementiert werden. Zum Beispiel:

Live-Demo zu Coliru

%Vor%     
Evgeny Panasyuk 01.07.2015 16:57
quelle

Tags und Links