std :: regex_match与另一个分配器

时间:2016-06-30 13:17:36

标签: regex c++11 stl 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>>;
}

我的分配器有一些日志记录,我可以清楚地看到,是的,它确实被使用了。 当我正确理解cppreference后,std::regex没有分配器,只有std::regex_match does

我的问题:

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

3 个答案:

答案 0 :(得分:0)

学习 std::regex_match

regex.h的定义之后
  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 );

    ...
}

它有效。我觉得太复杂了......

答案 1 :(得分:0)

根据 cppreference.com regex_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>>;
}

为了拥有

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

答案 2 :(得分:0)

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对象在内部使用。这很烦人:(