Как я могу использовать boost :: regex для boost :: циркулярного буфера?

Я собираю данные в boost :: round_buffer и хотел бы сейчас выполнить поиск по регулярному выражению по содержимому, но у меня возникли некоторые трудности при получении boost :: regex, чтобы понять, как смотреть в буфер.

Вот урезанная версия того, что я хотел бы сделать на примере Вот:

    // Set up a pre-populated data buffer as an example
std::string test = "Fli<usefuldata>bble";
boost::circular_buffer<char> dataBuff;
for (std::string::iterator it = test.begin(); it != test.end(); ++it)
{
dataBuff.push_back(*it);
}

// Set up the regex
static const boost::regex e("<\\w*>");
std::string::const_iterator start, end;
start = dataBuff.begin(); // <-- error C2679
end = dataBuff.end();
boost::match_flag_type flags = boost::match_default;

// Try and find something of interest in the buffer
boost::match_results<std::string::const_iterator> what;
if (regex_search(start, end, what, e, flags))
{
// Do something - we found what we're after...
}

Я (вполне понятно, я думаю) получаю эту ошибку, когда я пытаюсь скомпилировать:

1>c:\projects\ProtocolBufferProcessor\ProtocolBufferProcessor.h(53): error C2679: binary '=' : no operator found which takes a right-hand operand of type 'boost::cb_details::iterator<Buff,Traits>' (or there is no acceptable conversion)
1>          with
1>          [
1>              Buff=boost::circular_buffer<char>,
1>              Traits=boost::cb_details::nonconst_traits<std::allocator<char>>
1>          ]
1>          c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\xstring(435): could be 'std::_String_iterator<_Elem,_Traits,_Alloc> &std::_String_iterator<_Elem,_Traits,_Alloc>::operator =(const std::_String_iterator<_Elem,_Traits,_Alloc> &)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Alloc=std::allocator<char>
1>          ]
1>          while trying to match the argument list '(std::_String_iterator<_Elem,_Traits,_Alloc>, boost::cb_details::iterator<Buff,Traits>)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Alloc=std::allocator<char>
1>          ]
1>          and
1>          [
1>              Buff=boost::circular_buffer<char>,
1>              Traits=boost::cb_details::nonconst_traits<std::allocator<char>>
1>          ]

…но есть ли что-то, что я могу сделать, кроме создания символьных строк std :: string из циклического буфера при каждом запуске регулярного выражения?

Я использую Boost v1.54, если это имеет значение.

1

Решение

вам нужно использовать тип итератора буфера:

Жить на Колиру

#include <boost/circular_buffer.hpp>
#include <boost/regex.hpp>

using buffer_t = boost::circular_buffer<char>;

int main() {
// Set up a pre-populated data buffer as an example
std::string test = "Fli<usefuldata>bble";
buffer_t dataBuff;
for (std::string::iterator it = test.begin(); it != test.end(); ++it)
{
dataBuff.push_back(*it);
}

// Set up the regex
static const boost::regex e("<\\w*>");

buffer_t::const_iterator start = dataBuff.begin(); // <-- error C2679
buffer_t::const_iterator end = dataBuff.end();
boost::match_flag_type flags = boost::match_default;

// Try and find something of interest in the buffer
boost::match_results<buffer_t::const_iterator> what;
if (regex_search(start, end, what, e, flags))
{
// Do something - we found what we're after...
}
}
1

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector