В настоящее время я пишу некоторый код для игры, и часть этого включает в себя создание истории действий, которые до сих пор происходили в игре. Эта история хранится в векторе state_pair_t
парные действия (action_t
s) и указатели на игровое состояние результата после выполнения действия. Теперь у меня есть некоторая функция, которая просматривает историю, начиная с самого последнего момента времени, и повторяет ее в обратном направлении, пока не будет найдено действие определенного типа, а затем возвращает ссылку на нее. Теперь мы решили, что это может быть хорошим ходом при разработке, чтобы использовать опцию boost, чтобы вернуть no_action
если не было найдено никаких действий и использовать boost::optional
иметь дело с этими функциями, которые должны возвращать значение, но которые могут не иметь возвращаемого значения. Когда я действительно попытался реализовать это, я столкнулся с ошибкой, которую я не понимаю:
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;
}
Теперь это дает ошибку компиляции:
Error error C2664: 'boost::optional<T>::optional(boost::none_t)' : cannot convert parameter 1 from 'const action_t' to 'boost::none_t'
Теперь, если я немного изменю это на:
if(!(is_action_type< A >(rcit->first))){
return boost::optional<action_t>(rcit->first);
}
Я получаю еще одну ошибку:
error C2664: 'boost::optional<T>::optional(boost::none_t)' : cannot convert parameter 1 from 'boost::optional<T>' to 'boost::none_t'
Я не уверен, что любая из этих ошибок пытается сказать мне здесь. То, что я пытаюсь сделать здесь, не очень хорошая идея с boost::optional
? Это вообще возможно?
Дополнительные ссылки сами по себе являются хорошей идеей; они специально упоминаются как таковые в недавняя статья n3527, предназначен для стандартизации как компонент библиотеки в C ++ 14. Они поддерживаются в Boost.Optional.
Проблема с вашим кодом в том, что вы пытаетесь привязать неконстантную необязательную ссылку к const lvalue; если вы измените boost::optional< action_t& >
в boost::optional< const action_t& >
должно скомпилироваться нормально.
Других решений пока нет …