我目前正在为游戏编写一些代码,其中一部分涉及创建游戏到目前为止所发生的操作的历史记录.该历史存储在state_pair_t的动作对(action_t)的向量中,并且在动作完成后指向结果游戏状态的指针.现在我有一个函数可以查看从最近时间点开始的历史记录并向后迭代,直到找到某个类型的动作然后返回对它的引用.现在我们决定,如果没有找到任何动作,使用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?它甚至可能吗?
最佳答案 可选参考本身就是一个好主意;它们在
recent paper n3527中被特别提及,旨在标准化为C14中的库组件.它们在
Boost.Optional得到支持.
您的代码的问题在于您尝试将非const可选引用绑定到const lvalue;如果你改变boost :: optional< action_t&安培; > to boost :: optional< const action_t& >它应该编译好.