2

Boost :: xpressiveを使い始めたばかりで、優れたライブラリであることがわかりました...ドキュメントを調べて、!を使おうとしました。演算子(0または1)ですが、コンパイルされません(VS2008)。

「sip:」で始まる場合とそうでない場合がある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;
}`
4

2 に答える 2

8

DSELのほとんどを悩ませているバグに遭遇しました。

問題は、特定の言語で実際に定義されている特定の演算子を呼び出す必要があることです。ただし、この演算子はC ++にすでに存在するため、ルックアップとオーバーロードの解決の通常のルールが適用されます。

適切な演算子の選択はADL(Argument Dependent Lookup)を使用して行われます。つまり、演算子が適用されるオブジェクトの少なくとも1つは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である特別な「マーカー」を使用するため、またはウイルス効果のために機能します(たとえば、左側の式が関連しているため、「@」が機能します)。Xpressive_w>>Xpressive

使用しましたか:

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

Xpressive演算子の優先順位規則のおかげで右側の引数が「汚染」されているため、これは機能します。

ただし、ここoperator!では最も優先度の高いものの1つがあります。そのため、その範囲は次のように制限されます。

`!"sip:"`

また、"sip:"はタイプchar const[5]であるため、レギュラーoperator!を呼び出すだけで、適用される式がであると正しく結論付け、値trueに評価されます。boolfalse

を使用as_xprすると、C文字列をXpressiveオブジェクトに変換し、名前空間operator!からの権利Xpressiveを考慮に入れることができ、過負荷の解決が適切に開始されます。

于 2010-09-14T14:43:29.010 に答える
1

as_xprヘルパーを使用する必要があります...

!as_xpr("sip:")
于 2010-09-14T12:25:22.777 に答える