私は現在、ゲームのコードを書いています。その一部には、ゲームでこれまでに行われたアクションの履歴を作成することが含まれます。この履歴は、state_pair_t
のアクションのペア ( action_t
) と、アクションが行われた後の結果のゲーム状態へのポインターのベクトルに格納されます。現在、最新の時点から履歴を調べ、特定のタイプのアクションが見つかるまで逆方向に反復し、それへの参照を返す関数があります。no_action
ここで、boost optional を使用してアクションが見つからない場合に を返し、 を使用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
んか? それは可能ですか?