Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用boost::xpressive static引用语义操作中的可选子匹配?_C++_Boost_Boost Xpressive_Xpressive - Fatal编程技术网

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

C++ 如何使用boost::xpressive static引用语义操作中的可选子匹配?,c++,boost,boost-xpressive,xpressive,C++,Boost,Boost Xpressive,Xpressive,我有一个boost Xpression sregex和语义动作,相当于以下内容: Rule = ('[' >> (s1=!(set=')',']','>')))[some_op(as<std::string>(s1))]; 进入: 模板 结构作为 { BOOST_PROTO_CALLABLE() typedef T result_type; 模板 T运算符()(值常量和值)常量 { 如果(val.first==val.second) { 返回T(); } 其他的

我有一个boost Xpression sregex和语义动作,相当于以下内容:

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

模板
结构作为
{
BOOST_PROTO_CALLABLE()
typedef T result_type;
模板
T运算符()(值常量和值)常量
{
如果(val.first==val.second)
{
返回T();
}
其他的
{
返回词法转换(val);
}
}
};

这让我相信,也许这是需要在
xpressive
本身中解决的问题。但是我还不是100%确信我没有做错什么,任何对
xpressive
稍有了解的人都会对此有所了解吗?

经过进一步调查,并与
xpressive
的作者交谈后,我得出结论,这要么是
词法转换行为的倒退,要么是
xpressive
预期的缺陷
lexical\u cast
的行为。

不确定它是否受支持,但您是否尝试过
一些操作(如(s1))
?@ildjam不幸的是,我认为这不会有帮助,因为
lexical\u cast
仍然会发生并抛出错误。我能看到
optional
在这里起到帮助作用的唯一方法是,如果
s1
本身是使用它声明的,那么需要在
xpressive
本身内部进行更改。为了以防万一,我确实尝试了你的建议,但似乎无法使它以一种有用的方式发挥作用。是的,我不确定Xpression是否支持与Boost.Optional的集成(Boost.Spirit支持,这就是为什么我认为Xpression可能支持的原因)。我认为你最好的选择是让
一些操作
进行适当的
子匹配
,并在转换为字符串之前进行适当的成功检查。这确实是
词法转换
中的回归。我已经提交了一份申请。谢谢你的报道!
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);
        }
    }
};