我遇到了如何将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>>;
}
我的分配器有一些日志记录,我可以清楚地看到,是的,它确实被使用了。
当我正确理解cppreference后,std::regex
没有分配器,只有std::regex_match
does。
我的问题:
如何定义 - 根据上述类型 - 在namespace FaF
基于std::regex_match
使用我的STL内存分配器的附加模板?
答案 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对象在内部使用。这很烦人:(