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::match
和 std::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.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>>;
}
为了
- 结果和
- 通过您的分配器分配的字符串字符和
- 正确的论点。
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 对象在内部使用。这很烦人:(
我不知道如何将 regex_match
模板与我自己的内存 STL 分配器一起使用。
这是我的代码:
FaF::smatch stringResults;
std::regex expression( "expression" );
std::regex_match( FaF::string-variable, stringResults, expression );
对于 std::match
和 std::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.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>>;
}
为了
- 结果和
- 通过您的分配器分配的字符串字符和
- 正确的论点。
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 对象在内部使用。这很烦人:(