gsl::span 无法通过 std::regex 编译
gsl::span fails to compile with std::regex
我正在尝试使用 gsl::span
将一些数据从混合 binary/ascii 数据的打包结构(因此没有 vector
或 string
)传递给函数,我想用正则表达式对其进行操作,但出现以下错误:
error C2784: 'bool std::regex_match(_BidIt,_BidIt,std::match_results<_BidIt,_Alloc> &,const std::basic_regex<_Elem,_RxTraits> &,std::regex_constants::match_flag_type)' : could not deduce template argument for 'std::match_results>,_Alloc> &' from 'std::cmatch'
see declaration of '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]+"));
}
问题是当迭代器类型为gsl::continuous_span_iterator
时std::regex_match
无法解析函数重载,因为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(".*"));
}
解决方法涵盖将相同或不同范围的跨度传递给函数的情况。
我正在尝试使用 gsl::span
将一些数据从混合 binary/ascii 数据的打包结构(因此没有 vector
或 string
)传递给函数,我想用正则表达式对其进行操作,但出现以下错误:
error C2784: 'bool std::regex_match(_BidIt,_BidIt,std::match_results<_BidIt,_Alloc> &,const std::basic_regex<_Elem,_RxTraits> &,std::regex_constants::match_flag_type)' : could not deduce template argument for 'std::match_results>,_Alloc> &' from 'std::cmatch'
see declaration of '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]+"));
}
问题是当迭代器类型为gsl::continuous_span_iterator
时std::regex_match
无法解析函数重载,因为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(".*"));
}
解决方法涵盖将相同或不同范围的跨度传递给函数的情况。