gsl :: span не компилируется с помощью std :: regex

Я пытаюсь использовать 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

Решение

Проблема в том, что 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(".*"));
}

Тем не менее, на момент написания этой статьи, пересмотренный подход итератора все еще не будет компилироваться из-за проблема № 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(".*"));
}

Обходной подход охватывает случаи, когда в функцию передаются отрезки одинакового или разного экстента.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]