2016-06-30 8 views
1

regex_matchテンプレートを独自のメモリSTLアロケータで使用する方法が固まっています。std :: regex_match with another Allocator

これは私のコードです:std::matchstd::stringについては

FaF::smatch stringResults; 
std::regex expression("expression"); 
std::regex_match(FaF::string-variable, stringResults, expression); 

私が成功したので、私は上記の例では、それを使用します。

namespace FaF 
{ 
    using smatch = std::match_results<std::string::const_iterator, 
              Allocator<std::string::const_iterator>>; 
    using string = std::basic_string<char, std::char_traits<char>, Allocator<char>>; 
} 

私のアロケータは、いくつかのログを持って、私ははっきりと見ることができますはい、実際に使用されています。 cppreferenceを正しく理解すると、std::regexにはアロケータがありませんが、std::regex_matchdoesです。

私の質問:

定義する方法 - 上記のタイプに従って - namespace FaFで私のSTLのメモリアロケータを使用しているstd::regex_matchに基づいて追加のテンプレートを?

+0

あなたは自分がどのような問題を抱えているのか分かりません。 'std :: regex_match'は、「テンプレート引数の減算」と呼ばれる魔法を使って、第1引数と第2引数から自動的に割り当て子を取り出します。これはあなたが望むものではありませんか?あなたが必要と感じる追加的な定義は何ですか?またその理由は何ですか? –

+0

ちなみに、 'std :: match_results 'は、あなたのtypedefが信じるように、 'Iter'だけでなく、' std :: sub_match 'のインスタンスを割り当てるためにそのアロケータを使います。 –

+0

@IgorTandetnik 1)私は既にIter項目も拡張しなければならないと思っていました。 2) 'std :: regex_match'が同じアロケータを使用しているとは思わない。私のログには5回呼び出され、' stringResults'には5つの項目があることがわかっているからだ。私はそれも4に変更し、ログは4割り当てを表示しました。したがって私はこの質問をしました。なぜなら、私にとっては、「テンプレート引数の控除」がないことは明らかです。 –

答えて

0

template<typename _Ch_traits, typename _Ch_alloc, 
     typename _Alloc, typename _Ch_type, typename _Rx_traits> 
    inline bool 
    regex_match(const basic_string<_Ch_type, _Ch_traits, _Ch_alloc>& __s, 
     match_results<typename basic_string<_Ch_type, 
     _Ch_traits, _Ch_alloc>::const_iterator, _Alloc>& __m, 
     const basic_regex<_Ch_type, _Rx_traits>& __re, 
     regex_constants::match_flag_type __flags 
     = regex_constants::match_default) 
    { return regex_match(__s.begin(), __s.end(), __m, __re, __flags); } 

regex.hstd::regex_matchの定義を勉強した後、私は理解してFaF::stringと私自身のFaF::smatch定義の私自身の定義_Allocが使用されているため、十分である[定義は、問題のある]ことに気づきそこ。

私のコードは次のようである:

void getBarDataEntryFromMySql(const FaF::string & memcacheBarDataEntry) 
{ 
    const char expressionString [] = "expression"; 

    FaF::smatch stringResults; 
    std::regex expression(expressionString); 
    std::regex_match(memcacheBarDataEntry, stringResults, expression); 

    ... 
} 

、それが動作します。私は

0

cppreference.comによると、regex_matchの第2引数は最初の引数はstd::basic_string<CharT,STraits,SAlloc>だろう

std::match_results<typename std::basic_string<CharT,STraits,SAlloc>::const_iterator, Alloc> 

でなければなりません...あまりにも複雑考えていました。

これは、多少のように好きにFaFであなたの別名宣言が必要になります。

namespace FaF 
{ 
    using string_type = std::basic_string<char, std::char_traits<char>, 
          Allocator<char>>; 
    using match_type = std::match_results<string_type::const_iterator, 
          Allocator<string_type::const_iterator>>; 
} 

あなたのアロケータと

  • 正しい経由で割り当てられた

    • 結果と
    • 文字列の文字を持っているために、議論
  • +0

    'std :: regex_match'は"文字列 "を割り当てません。 'SAlloc'は何にも使われていません。 'std :: regex_match(string、...)'は単にstd :: regex_match(string.begin()、string.end()、...)を呼び出します。後者はもはや 'SAlloc'を持っていませんが、' std :: sub_match'インスタンスを割り当てるために使われるアロケータは1つだけです。 –

    +0

    @IgorTandetnik: 'SAlloc'は、文字列の文字を割り当てるために使われます。問題の過負荷に合格した。 OPは明らかに 'string'とiteratorの両方のカスタムアロケータを必要とします。 – Pixelchemist

    +0

    'std :: regex_match'はどんな文字列の文字も割り当てません。 'basic_string'パラメータは' const'です。その出力は 'std :: sub_match'オブジェクトのリストであり、それぞれが元の文字列にイテレータのペアを保持しています。 –

    関連する問題