2013-04-05 5 views
3

Je suis en train d'écrire du code pour un jeu et une partie de cela consiste à créer un historique des actions qui ont eu lieu jusqu'ici dans le jeu. Cet historique est stocké dans un vecteur des paires d'actions state_pair_t (action_t) et des pointeurs vers le résultat du jeu après qu'une action ait été effectuée. Maintenant j'ai une fonction qui regarde à travers l'histoire en commençant au moment le plus récent et itère en arrière jusqu'à ce qu'une action d'un certain type soit trouvée puis renvoie une référence à cela. Maintenant, nous avons décidé qu'il pourrait être un bon coup de design d'utiliser boost optionnel pour retourner un no_action si aucune action n'a été trouvée et utiliser boost::optional pour gérer ces fonctions qui devraient renvoyer une valeur mais qui n'ont peut-être pas de valeur à renvoyer. Quand je l'ai vraiment essayé de mettre en œuvre ce que je tombe sur une erreur que je ne comprends pas:boost :: référence optionnelle avec boost :: variant type

typedef boost::variant< 
    A, 
    B, 
    B 
> action_t; 

typedef boost::optional< action_t& > opt_action_ref_t; 

const opt_action_ref_t no_action = opt_action_ref_t(); 

/*! A state pair is the combination of a particular action and the resulting game state */ 
typedef std::pair< const action_t, game_state_ptr > state_pair_t; 

opt_action_ref_t get_last_non_A_action() const{ 
    std::vector<state_pair_t>::const_reverse_iterator rcit; 
    for(rcit = m_states.rbegin(); m_states.rend() != rcit ; ++rcit){ 
     if(!(is_action_type<A>(rcit->first))){ 
      return rcit->first; \\error at compile time 
     } 
    } 

    return no_action; 
} 

Maintenant, cela donne une erreur de compilation:

Error error C2664: 'boost::optional<T>::optional(boost::none_t)' : cannot convert parameter 1 from 'const action_t' to 'boost::none_t' 

Maintenant, si je change légèrement ce à:

if(!(is_action_type<A>(rcit->first))){ 
     return boost::optional<action_t>(rcit->first); 
    } 

je reçois une autre erreur:

error C2664: 'boost::optional<T>::optional(boost::none_t)' : cannot convert parameter 1 from 'boost::optional<T>' to 'boost::none_t' 

Je ne suis pas sûr de savoir ce que ces erreurs essaient de me dire ici. Est-ce que je suis en train de faire ici n'est pas une bonne idée avec boost::optional? Est-ce même possible?

Répondre

2

Les références facultatives sont en soi une bonne idée; ils sont spécifiquement mentionnés en tant que tels dans le recent paper n3527, destiné à être standardisé en tant que composant de bibliothèque en C++ 14. Ils sont pris en charge dans Boost.Optional.

Le problème avec votre code est que vous essayez de lier une référence facultative non const à une valeur de const; Si vous changez boost::optional< action_t& > en boost::optional< const action_t& > il devrait compiler bien.

+0

Merci pour cette réponse, Il semble que cela la rend presque compile correctement, mais maintenant je rencontre un problème où le compilateur se plaint que 'T = opt_action_ref_t' ne fait pas partie du type de variante' action_t'. Je trouve cela un peu étrange parce que je ne veux pas que 'opt_action_ref_t' soit un type dans la variante. Y at-il quelque chose que je fais clairement mal ici? – shuttle87

Questions connexes