boost :: дополнительная ссылка с boost :: option type

В настоящее время я пишу некоторый код для игры, и часть этого включает в себя создание истории действий, которые до сих пор происходили в игре. Эта история хранится в векторе state_pair_tпарные действия (action_ts) и указатели на игровое состояние результата после выполнения действия. Теперь у меня есть некоторая функция, которая просматривает историю, начиная с самого последнего момента времени, и повторяет ее в обратном направлении, пока не будет найдено действие определенного типа, а затем возвращает ссылку на нее. Теперь мы решили, что это может быть хорошим ходом при разработке, чтобы использовать опцию 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? Это вообще возможно?

4

Решение

Дополнительные ссылки сами по себе являются хорошей идеей; они специально упоминаются как таковые в недавняя статья n3527, предназначен для стандартизации как компонент библиотеки в C ++ 14. Они поддерживаются в Boost.Optional.

Проблема с вашим кодом в том, что вы пытаетесь привязать неконстантную необязательную ссылку к const lvalue; если вы измените boost::optional< action_t& > в boost::optional< const action_t& > должно скомпилироваться нормально.

2

Другие решения

Других решений пока нет …