std::regex_match 与另一个分配器

std::regex_match with another Allocator

我不知道如何将 regex_match 模板与我自己的内存 STL 分配器一起使用。

这是我的代码:

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

对于 std::matchstd::string 我是成功的,因此我在上面的例子中使用它:

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>>;
}

我的Allocator有一些日志记录,我看得很清楚,是的,它确实被使用了。 当我理解了cppreference correctly, then std::regex does not have an allocator, but std::regex_match does

我的问题:

如何根据上述类型在 namespace FaF 中定义一个基于 std::regex_match 的附加模板,该模板正在使用我的 STL 内存分配器?

研究regex.h

std::regex_match的定义后
  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); }

我理解并意识到我自己定义的 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 );

    ...
}

并且有效。我想的太复杂了...

根据cppreference.comregex_match的第二个参数应该是

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

第一个参数是 std::basic_string<CharT,STraits,SAlloc>.

这需要您在 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>>;
}

为了

  • 结果和
  • 通过您的分配器分配的字符串字符和
  • 正确的论点。

FWIW,VS 2017 无法编译 match_type,因为它需要使用 sub_match:

using match_type = std::match_results<string_type::const_iterator,
    Allocator<std::sub_match<string_type::const_iterator>>>;

编辑:实际上似乎不可能完全覆盖 VS2017 中 std::regex 使用的分配器。有一些 std::vector 不采用分配器参数,由 _Matcher 对象在内部使用。这很烦人:(