我剛開始使用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