2013-04-05 115 views
3

我目前正在編寫一些遊戲代碼,其中一部分涉及創建遊戲中迄今爲止發生的操作的歷史記錄。該歷史存儲在state_pair_t的動作對(action_t's)的向量中,以及在動作完成後指向結果遊戲狀態的指針。現在我有一個函數,從最近的時間點開始查看歷史記錄,並向後迭代,直到找到某種類型的操作,然後返回對該操作的引用。現在我們決定,如果沒有找到任何操作,使用boost可選返回no_action,並使用boost::optional來處理這些函數,這些函數應該返回一個值,但可能沒有返回值。當我其實是想實現這一點,我碰到一個錯誤,我不明白:boost ::可選參考與boost :: variant類型

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?它甚至有可能嗎?

回答

2

可選參考本身是一個好主意;它們在recent paper n3527中被特別提及,用於標準化爲C++ 14中的庫組件。它們在Boost.Optional中受支持。

你的代碼的問題在於,你試圖將一個非const可選引用綁定到一個常量左值;如果你將boost::optional< action_t& >更改爲boost::optional< const action_t& >它應該編譯好。

+0

感謝這個答案,這似乎幾乎使它編譯正確,但現在我遇到了一個問題,其中編譯器抱怨'T = opt_action_ref_t'不是'action_t'變體類型的一部分。我覺得這有點奇怪,因爲我不希望'opt_action_ref_t'成爲變體中的一個類型。我在這裏顯然做錯了嗎? – shuttle87 2013-04-07 19:20:10