我试图用来gsl::span
将一些数据从混合的二进制/ ASCII数据的打包结构(因此为novector
或string
)传递给一个函数,在该函数中我想使用正则表达式对其进行操作,但是出现以下错误:
错误C2784:'布尔std :: regex_match(_BidIt,_BidIt,std :: match_results <_BidIt,_Alloc>&,const std :: basic_regex <_Elem,_RxTraits>&,std :: regex_constants :: match_flag_type)':无法推断'std :: cmatch'中'std :: match_results>,_ Alloc>&'的模板参数
参见'std :: regex_match'的声明
这是我想做的事情:
#include <regex>
#include "gsl.h"
using namespace std;
using namespace gsl;
int main(int argc, const char **argv)
{
char lat[8] = { '0', '1', '9', '0', '0', '0', '0', 'E' };
span<char> s = lat;
// in a complex implementation this would be in a function,
// hence the desire for span<>
std::cmatch match;
std::regex_match(s.begin(), s.end(), match, std::regex("[0-9]+"));
}
问题是std::regex_match
当迭代器类型为时不能解决函数重载,gsl::continuous_span_iterator
因为std::cmatch
使用aconst char*
作为迭代器类型。无论std::smatch
或者std::cmatch
是在这种情况下,适当的,你需要自己的std::match_results
类型。这是应该如何做:
#include <regex>
#include "gsl.h"
using namespace std;
using namespace gsl;
int main(int argc, const char **argv)
{
char lat[8] = { '0', '1', '9', '0', '0', '0', '0', 'E' };
span<char> s = lat;
std::match_results<decltype(s)::iterator> match;
std::regex_match(s.begin(), s.end(), match, std::regex(".*"));
}
就是说,在撰写本文时,由于问题#271,修订后的迭代器方法仍然无法编译。
在此问题解决之前,另一个解决方法是:
int main(int argc, const char **argv)
{
char lat[8] = { '0', '1', '9', '0', '0', '0', '0', 'E' };
span<char> s = lat;
std::cmatch match;
std::regex_match(&s[0], &s[s.length_bytes()], match, std::regex(".*"));
}
解决方法涵盖了将相同或不同范围的跨度传递给函数的情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句