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

标签 c++ boost boost-xpressive xpressive

我有一个 boost xpressive sregex 和语义 Action 等同于以下内容:

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

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

我该如何解决这个问题,它以前有效只是巧合吗?我应该使用更安全的方法来解决这个问题吗?或者这只是例如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 有更多了解的人对此有一些了解吗?

最佳答案

在进一步调查并与 Xpressive 的作者交谈后,我得出结论,这要么是 lexical_cast 行为的回归,要么是xpressive 期望 lexical_cast 表现的方式。

关于c++ - 如何使用 boost::xpressive static 在语义操作中引用可选的子匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9009431/

相关文章:

c++ - 多线程程序线程连接问题

c++ - boost::xpressive 查看序列的开头

c++ - 当我将头文件放入时,期望函数之前的初始声明符

c++ - 删除 vector 问题 vector 中的对象

c++ - 标准命名空间问题

c++ - 如何避免定义与 boost::spirit::lex 中的所有内容匹配的 token

c++ - 为什么这个 boost::variant 缺少运算符 <<?

c++ - 标记一个字符串,不包括引号内的定界符

c++ - boost 表现力!接线员不工作

C++ 使用模板类调用非静态成员函数