如何使用boost :: xpressive static在语义动作中引用可选的子匹配?

时间:2012-01-25 20:01:51

标签: c++ boost boost-xpressive xpressive

我有一个提升xpressive sregex和语义动作,它等同于以下内容:

Rule = ('[' >> (s1=!(set=')',']','>')))[some_op(as<std::string>(s1))];

以前我在boost 1.43上使用它没有任何问题。我不得不最近升级到更新的提升,现在我遇到了以下问题。 当子匹配与任何内容不匹配时(因为它是可选的),在boost 1.48上,当bad_lexical_cast对空as个对象执行时,语义操作会抛出s1异常。

我怎样才能解决这个问题,它之前是否巧合,是否有更好的安全方式我应该这样做?或者这只是例如lexical_cast代码中的某些更改现在会中断xpressive

其他信息

我已经设法通过更改regex_actions.hpp中的以下内容来暂时解决实际问题:

template<typename T>
struct as
{
    BOOST_PROTO_CALLABLE()
    typedef T result_type;

    template<typename Value>
    T operator()(Value const &val) const
    {
        return lexical_cast<T>(val);
    }
};

分为:

template<typename T>
struct as
{
    BOOST_PROTO_CALLABLE()
    typedef T result_type;

    template<typename Value>
    T operator()(Value const &val) const
    {
        if(val.first==val.second)
        {
            return T();
        }
        else
        {
            return lexical_cast<T>(val);
        }
    }
};

这让我相信这可能需要在xpressive本身修复。然而,我并不是100%确信这不是我在做错的事情,任何对xpressive有更多了解的人都对此有所了解吗?

1 个答案:

答案 0 :(得分:1)

在进一步调查并与Xpressive的作者交谈之后,我得出结论:这可能是lexical_cast行为的回归,也可能是xpressive行为中的错误预期lexical_cast表现出来。