Я пытаюсь использовать 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]+"));
}
Проблема в том, что 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(".*"));
}
Обходной подход охватывает случаи, когда в функцию передаются отрезки одинакового или разного экстента.
Других решений пока нет …