7
votes

Boost :: Usage de variante

Je développe une application GUI via WxWidgets. Il possède 2 parties: partie de l'interface graphique et la partie "logique". Je veux avoir une partie logique totalement indépendante sur WxWidgets. Mais un composant de l'interface graphique de retour de Wxvariant et j'ai besoin de l'utiliser dans la partie logique.

Je cherche donc un moyen de "convertir" wxvariandt à boost :: variante

wxvariant fonctionne comme ça : xxx

alors je pense que quelque chose comme xxx

est-il possible d'utiliser boost :: variante (ou boost: : Tout) comme ça?


3 commentaires

Sauf si vous avez besoin de, pourquoi pas seulement utiliser wxany ? Si vous avez besoin de vous en attendre, envisagez de faire une vérification sur wxany avant d'attribuer de la valeur à boost :: variante ...


Regardez de plus près la documentation - il n'y a pas de type appelé Boost :: [V / V] ARIANT - Il s'agit d'une classe de modèle qui doit connaître les types à l'avance. La similitude de nom est principalement accidentelle, en fait, WXWDgets remplacera WxVariant avec WXANY à un moment donné pour éviter cela. Dans les nouvelles connexes, Boost.any est un peu plus proche, mais cela ne vous permet toujours pas d'analyser et de désautoriser des cordes, AF loin que je sache.


@phooji: merci ... C'est exactement comme si vous l'avez dit. J'étais juste confus sur le nom "Variante" ...


4 Réponses :


1
votes

boost :: variante (s'il vous plaît ne capitalise pas 'v') fonctionne une autre manière: vous ne pouvez récupérer que ce que vous mettez à l'intérieur. Pensez-y comme un syndicat de type sécurisé (R).

Vérification de la vérification Documénation et tutoriel ne sera pas aussi mal.

Boost.La bibliothèque ne diffère pas de Boost.Variant à cet égard (ce que vous mettez est ce que vous obtenez :)), mais boost :: n'importe quel est sans bornes :: Vous pouvez stocker la valeur de tout type dans boost :: n'importe quel , mais dans boost :: variante Vous ne pouvez stocker que ce qui a été déclaré par les paramètres de modèle de Variant.


0 commentaires

0
votes

boost :: variante ne convient pas à vous. Il existe d'autres moyens distincts pour convertir une chaîne en entiers, tels que strtol () , sscanf () , boost :: lexical_cast <> () ...


0 commentaires

4
votes

réponse simple? Non, vous ne pouvez pas convertir via des chaînes, cela induit une perte d'informations et boost :: variante ne tente pas automatiquement d'analyser les chaînes.

Je ne sais pas si wxvariant offre une conversion explicite - en général, il peut être difficile de convertir en boost :: variante sans tester pour des cas spéciaux. < / p>


0 commentaires

23
votes

Vous pouvez probablement utiliser boost :: variante code> avec quelques modifications. Pour commencer, vous devez dire boost :: variante code> quels types il stockera: xxx pré>

puisque vous utiliserez probablement ce type dans quelques endroits, Vous voudrez probablement créer un alias pour cela. IE P>

switch (x.which()) {
case 0: // it's an int
case 1: // it's a string
case 2: // it's a bool
}


3 commentaires

Une réponse de Boost.variant sans aucune mention de static_visitor ?


Je sais. Mais cela semblait un peu au-delà de la portée de la question.


Malheureusement, Boost :: Variante L'initialisation et l'affectation perdent leurs chèques de type strict quand bool est dans le mélange . ( svn.boost.org/trac/boost/ticket/719 )