4

私は現在、ゲームのコードを書いています。その一部には、ゲームでこれまでに行われたアクションの履歴を作成することが含まれます。この履歴は、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んか? それは可能ですか?

4

1 に答える 1

2

オプションの参照自体は良い考えです。最近の論文 n3527で特に言及されており、C++14 のライブラリ コンポーネントとして標準化することを目的としています。Boost.Optionalでサポートされています。

コードの問題は、非 const オプション参照を const 左辺値にバインドしようとしていることです。に変更boost::optional< action_t& >するboost::optional< const action_t& >と、正常にコンパイルされるはずです。

于 2013-04-05T07:29:04.570 に答える