2010-09-14 67 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命名空間考慮,和重載決議踢適當。