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?
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