C++ 如何使用boost::xpressive static引用语义操作中的可选子匹配?
我有一个boost Xpression sregex和语义动作,相当于以下内容: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(); } 其他的
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);
}
}
};