|
Boost Users : |
Subject: Re: [Boost-users] boost.xpressive: using placeholders with custom (check()) assertions
From: Alex Dubov (oakad_at_[hidden])
Date: 2010-06-25 08:32:20
Eric Niebler <eric <at> boostpro.com> writes:
>
> On 6/16/2010 3:04 AM, Alex Dubov wrote:
> > Greetings.
> >
> >
> > However, if functor is wrapped with assertion, this won't work:
> >
> > sregex r = (expr)[check(do_something(p_string, _))];
> >
> > Compilation will fail, because do_something has no method which
> > accepts xpressive::placeholder<> objects.
>
> It should if it is a lazy function. How is do_something defined? Can you
> send a self-contained program that demonstrates the problem you're having?
>
I'm using boost-1.41 and gcc-4.4.2. The error I'm receiving compiling an
example:
--------------------------------------------------------------------
testreg1.cpp:51: instantiated from here
/usr/include/boost/proto/context/default.hpp:426: error: no match for call to
â(const check_a_impl) (const boost::xpressive::detail::action_arg<int,
mpl_::int_<0> >&, const int&)â
testreg1.cpp:24: note: candidates are: bool check_a_impl::operator()(int&, int)
const
Here goes a problematic example itself:
--------------------------------------------------------------------
#include <iostream>
#include <boost/xpressive/regex_actions.hpp>
#include <boost/xpressive/xpressive_static.hpp>
using namespace std;
using namespace boost::xpressive;
const placeholder<int> _cnt = {{}};
struct count_a_impl {
typedef void result_type;
void operator()(int &cnt) const
{
++cnt;
}
};
function<count_a_impl>::type const count_a = {{}};
struct check_a_impl {
typedef bool result_type;
bool operator()(int &cnt, int val) const
{
++cnt;
return (cnt == val);
}
};
function<check_a_impl>::type const check_a = {{}};
int main(int argc, char **argv)
{
int cnt = 0;
string a_str("a_aaaaa___a_aa_aaa_");
const sregex expr1(*(as_xpr('a')[count_a(_cnt)] | _));
const sregex expr2(*(as_xpr('a')[check(check_a(_cnt, 5))] | _));
/* ^ this check() causes a problem */
sregex_iterator iter1(a_str.begin(), a_str.end(), expr1,
let(_cnt = cnt));
cout << "expr1 matched: " << iter1->str(0) << " counted " << cnt
<< endl;
cnt = 0;
sregex_iterator iter2(a_str.begin(), a_str.end(), expr2,
let(_cnt = cnt));
cout << "expr2 matched: " << iter2->str(0) << " counted " << cnt
<< endl;
return 0;
}
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net