2010-09-14 68 views
2

我刚开始使用Boost :: xpressive,并发现它是一个优秀的库...我经历了文档,并试图使用!运算符(零或一),但它不编译(VS2008)。Boost xpressive!操作员不工作

我想匹配SIP地址可能会或可能不会启动“SIP:”

!as_xpr("sip:") 

回答

8

你恰好遇到一个错误,必须使用

#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; 
}` 
+1

很好的回答!谢谢。 – rusbi 2010-09-15 07:01:24

1

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工作,因为你使用特殊的,因为病毒的作用“标志”是像(_wXpressive类型实例或(如“@”的时代的作品,因为对>>左边的表达式是Xpressive-相关)。

是你使用:

sregex re = "sip:" >> *(_w | '.') >> '@' >> *(_w | '.'); 
      ^^^^^^ ~~ ^^^^^^^^^^^ 
      Regular Xpressive 

它的工作,因为右手边参数由Xpressive感谢符的优先级规则“被污染”。

但是这里operator!具有最高优先级之一。在这样的,它的范围被限制为:

`!"sip:"` 

而且,由于"sip:"char const[5]类型的,它只是调用规则operator!这将正确地得出结论,其适用的表达是true,从而评估对boolfalse

使用as_xpr,将转换为C-字符串转换为Xpressive对象,从而在正确的operator!带来从Xpressive命名空间考虑,和重载决议踢适当。