我刚开始使用Boost :: xpressive,并发现它是一个优秀的库...我经历了文档,并试图使用!运算符(零或一),但它不编译(VS2008)。Boost xpressive!操作员不工作
我想匹配SIP地址可能会或可能不会启动“SIP:”
!as_xpr("sip:")
我刚开始使用Boost :: xpressive,并发现它是一个优秀的库...我经历了文档,并试图使用!运算符(零或一),但它不编译(VS2008)。Boost xpressive!操作员不工作
我想匹配SIP地址可能会或可能不会启动“SIP:”
!as_xpr("sip:")
你恰好遇到一个错误,必须使用
#include <iostream>
#include <boost/xpressive/xpressive.hpp>
using namespace boost::xpressive;
using namespace std;
int main()
{
sregex re = !"sip:" >> *(_w | '.') >> '@' >> *(_w | '.');
smatch what;
for(;;)
{
string input;
cin >> input;
if(regex_match(input, what, re))
{
cout << "match!\n";
}
}
return 0;
}`
as_xpr
帮手......那困扰大部分DSEL。
问题是你想要一个特定的操作符被调用,它是用你的特定语言实际定义的。然而,这个操作符已经存在于C++中,因此适用了查找和重载解析的正常规则。
选择正确的操作符是使用ADL(参数相关查找)完成的,这意味着操作员应用的至少一个对象应该是DSEL本身的一部分。
例如,考虑这个简单的代码片断:
namespace dsel
{
class MyObject;
class MyStream;
MyStream operator<<(std::ostream&, MyObject);
}
int main(int, char*[])
{
std::cout << MyObject() << "other things here";
}
由于表达式从左至右评价的dsel::MyObject
存在是病毒,即,DSEL将在这里被传播。
关于Xpressive
,大多数IT工作,因为你使用特殊的,因为病毒的作用“标志”是像(_w
)Xpressive
类型实例或(如“@”的时代的作品,因为对>>
左边的表达式是Xpressive
-相关)。
是你使用:
sregex re = "sip:" >> *(_w | '.') >> '@' >> *(_w | '.');
^^^^^^ ~~ ^^^^^^^^^^^
Regular Xpressive
它的工作,因为右手边参数由Xpressive
感谢符的优先级规则“被污染”。
但是这里operator!
具有最高优先级之一。在这样的,它的范围被限制为:
`!"sip:"`
而且,由于"sip:"
是char const[5]
类型的,它只是调用规则operator!
这将正确地得出结论,其适用的表达是true
,从而评估对bool
值false
。
使用as_xpr
,将转换为C-字符串转换为Xpressive
对象,从而在正确的operator!
带来从Xpressive
命名空间考虑,和重载决议踢适当。
很好的回答!谢谢。 – rusbi 2010-09-15 07:01:24