Une alternative bien supscope aux unions c ++?

Je pense que les syndicats peuvent être parfaits pour ce que j’ai en tête et surtout quand je considère que mon code doit être exécuté sur une famille de machines très hétérogène, en particulier des machines de faible puissance, ce qui m’embête le plus, c’est que ceux qui créent les compilateurs semble ne pas trop se soucier d’introduire et d’offrir un bon soutien syndical, par exemple, ce tableau est vide de sens en ce qui concerne le soutien des Unressortingcted Unions (Syndicats sans ressortingction) et c’est une vision vraiment déplaisante pour mes projets.

Il existe des alternatives à l’ union qui peuvent au moins imiter les mêmes propriétés?

Les syndicats sont bien pris en charge par la plupart des compilateurs. Les syndicats qui contiennent des membres dont le constructeur est non sortingvial (syndicats non restreints) sont mal pris en charge. Dans la pratique, vous souhaiterez presque toujours un constructeur personnalisé lors de la création de syndicats. Par conséquent, ne pas avoir un syndicat sans ressortingction est plus une gêne.

Alternativement, vous pouvez toujours utiliser un pointeur vide pointant vers une mémoire Malloc-ed avec une taille suffisante pour le membre le plus grand. L’inconvénient est que vous auriez besoin d’une conversion de type explicite.

Vous pouvez toujours faire essentiellement la même chose en utilisant des conversions explicites:

 struct YourUnion { char x[the size of your largest object]; A &field1() { return *(A*)&x[0]; } int &field2() { return *(int*)&x[0]; } }; YourUnion y; new(&y.field1()) A(); // construct A y.field1().~A(); // destruct A y.field2() = 1; // ... 

(Cela correspond à zéro surcharge par rapport à, par exemple, Boost.Variant.)

EDIT: plus syndical et sans modèles.

Boost.Variant est une alternative populaire à l’union.

Les types que vous utilisez doivent être copiables.

Mise à jour: C ++ 17 a introduit std :: variant . Ses exigences sont basées sur Boost.Variant. Il est modernisé pour prendre en compte les fonctionnalités de C ++ 17. Il n’est pas compatible avec les compilateurs C ++ 98 (comme Boost). Il vient gratuitement avec la bibliothèque standard. S’il est disponible, il est préférable de l’utiliser comme alternative aux syndicats.