Subject: Re: [Boost-bugs] [Boost C++ Libraries] #4020: regex::match_results::format functor cannot use member variables
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2010-03-18 16:32:43
#4020: regex::match_results::format functor cannot use member variables
--------------------------------------------------+-------------------------
Reporter: Keith MacDonald <keith@â¦> | Owner: johnmaddock
Type: Support Requests | Status: closed
Milestone: Boost 1.43.0 | Component: regex
Version: Boost 1.42.0 | Severity: Problem
Resolution: fixed | Keywords: regex functor
--------------------------------------------------+-------------------------
Comment(by Keith MacDonald <keith@â¦>):
Thanks for the clarification. Returning to C++ after a break, I had
forgotten that it was a standard library convention to pass functors by
value. Anyway, I've amended my example code to take account of that, and
you're welcome to use it in the documentation:
{{{
// Code to insert an incremented count before each word in the source
text.
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <boost/regex.hpp>
#include <boost/shared_ptr.hpp>
typedef wchar_t char_t;
typedef std::wstring string_t;
template <class M>
class functor
{
public:
functor() : m_pImpl(new functor_data) {}
template <class O>
O operator()(const M& m, O i)
{
// Generate the sequence number in brackets:
char_t buf[16];
O i2(i);
*i2++ = L'(';
_itow(++m_pImpl->nCounter, buf, 10);
i2 = std::copy(buf, buf + wcslen(buf), i2);
*i2++ = L')';
// Copy the matched text;
return m.format(i2, L"$0");
}
private:
struct functor_data
{
functor_data() : nCounter(0) {}
int nCounter;
};
boost::shared_ptr<functor_data> m_pImpl;
};
int wmain(int argc, char_t* argv[])
{
string_t sText(L"The quick brown fox jumped over the lazy dog");
string_t sRE(L"\\w+");
boost::regex_constants::match_flag_type matchFlags =
boost::regex_constants::match_default;
boost::basic_regex<char_t> e;
e.assign(sRE, matchFlags);
typedef string_t::const_iterator string_iterator;
boost::regex_iterator<string_iterator> reit(sText.begin(),
sText.end(), e, matchFlags);
boost::regex_iterator<string_iterator> reEnd;
boost::match_results<string_iterator> last_m = *reit;
std::basic_ostringstream<char_t> stream;
std::ostream_iterator<char_t, char_t> streamIter(stream);
functor<boost::match_results<string_iterator> > func;
for ( ; reit != reEnd; ++reit) {
const boost::match_results<string_iterator>& m = *reit;
// copy the source up to this match:
std::copy(m.prefix().first, m.prefix().second, streamIter);
// replace the matched text:
m.format(streamIter, func);
last_m = m;
}
// copy the remainder of the source string:
std::copy(last_m.suffix().first, last_m.suffix().second, streamIter);
// output the result:
std::wcout << stream.str() << std::endl;
return 0;
}
}}}
-- Ticket URL: <https://svn.boost.org/trac/boost/ticket/4020#comment:4> Boost C++ Libraries <http://www.boost.org/> Boost provides free peer-reviewed portable C++ source libraries.
This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:02 UTC