使用boost :: variant类型的boost :: optional引用

时间:2013-04-05 04:28:42

标签: c++ boost-variant boost-optional

我正在为游戏编写一些代码,其中一部分涉及创建游戏到目前为止所发生的操作的历史记录。此历史记录存储在state_pair_t个动作对(action_t)的向量中,并在动作完成后指向结果游戏状态。现在我有一个函数可以查看从最近时间点开始的历史记录并向后迭代,直到找到某个类型的动作然后返回对它的引用。现在我们决定如果没有找到任何操作,使用boost optional来返回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的好主意吗?它甚至可能吗?

1 个答案:

答案 0 :(得分:2)

可选参考本身就是一个好主意;它们在recent paper n3527中特别提到,用于标准化为C ++ 14中的库组件。它们在Boost.Optional中受到支持。

您的代码的问题在于您尝试将非const可选引用绑定到const左值;如果您将boost::optional< action_t& >更改为boost::optional< const action_t& >,则应该正常编译。