Étant donné:Déterminer le plus grand sizeof() en boost variante
boost::variant<T1,T2,T3,...,TN>
Calculer les éléments suivants au moment de la compilation:
max(sizeof(T1), sizeof(T2), sizeof(T3),... ,sizeof(TN))
Je ne savais pas comment aborder, mais this réponse à jeter un peu de lumière sur comment je pourrais commencer. En utilisant le code dans cette réponse avec deux types, T1
et T2
, je pourrais utiliser ce qui suit dans un fichier source pour obtenir la taille de l'objet plus grand:
size_t largestSize = sizeof(largest<T1, T2>::type);
C'est exactement ce que je voudrais faire, mais j'ai besoin du modèle largest
pour travailler avec plus de deux classes - en particulier, il faudrait vérifier tous les types stockés dans un objet boost::variant
.
Je sais que boost::variant
a un typedef types
, qui définit une sorte de liste de types dans la variante. Le problème est, je suis totalement perdu quand j'essaie d'enrouler ma tête autour de toutes les choses dans l'implémentation. Je ne comprends pas intuitivement ce boost::variant::types
est, et comment je pourrais être en mesure de le transmettre dans mon propre modèle qui fait quelque chose avec elle.
Dans ma tête, c'est ce que la mise en œuvre finale pourrait ressembler à:
typedef boost::variant<T1, T2, T3, T4> MyVariant;
size_t largestSize = sizeof(largest<MyVariant::types>::type);
Malheureusement, je ne sais pas comment aller sur l'implémentation de cette version de largest
. Je ne suis pas sûr si c'est une approche raisonnable, donc je suis ouvert à d'autres façons d'accomplir cela (peut-être appliquer un boost::static_visitor
à tous les types au moment de la compilation?).
Je suis allé avec cette solution, mais pendant mes tests, j'ai remarqué que ce ne sera pas compilé avec GCC 4.8.2 ou 3.5.0 et plus clang , tandis que la réponse de Wojciech ci-dessous se compile avec GCC 4.7.3 et clang 3.0. J'ai également remarqué qu'aucune des deux solutions ne compilait avec MSVC19. Rien de tout cela n'a d'importance dans le contexte de la question, mais cela pourrait être utile pour quelqu'un qui trébuche sur cette réponse. –