我试图使用gsl::span
将混合二进制/ ascii数据的压缩结构中的一些数据(因此没有vector
或string
)传递给函数,其中我想用正则表达式对它进行操作,但是我得到以下错误:
错误C2784:' bool std :: regex_match(_BidIt,_BidIt,std :: match_results< _BidIt,_Alloc>&,const std :: basic_regex< _Elem,_RxTraits>&,std :: regex_constants: :match_flag_type)' :无法推断' std :: match_results>,_ Alloc>的模板参数&安培;'来自' std :: cmatch'
参见' 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]+"));
}
答案 0 :(得分:2)
问题是当迭代器类型为std::regex_match
时,gsl::continuous_span_iterator
无法解析函数重载,因为std::cmatch
使用const 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(".*"));
}
也就是说,在撰写本文时,由于issue #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(".*"));
}
变通方法涵盖了将相同或不同范围的跨度传递给函数的情况。