Getting much much closer:

The following will work:
Add that function
    std::string& replace (std::string s, int pos, int n, const char* c)
    {
        return s.replace (pos, n , c);
    }

And use it instead of std::string::replace
            std::transform( array.begin(), array(), std::back_inserter(tr),
                           boost::bind(replace, boost::bind(&removeConst, boost::bind(&Foo::get, _1)),
                                       0, 5, ""));

WORKS !!!

HOWEVER, if I'm putting & in replace's std::string argument, I'll get the compile errors (If u need them, just let me know and I'll dump it here). so that minor change (note the std::string&)
    std::string& replace (std::string& s, int pos, int n, const char* c)
    {
        return s.replace (pos, n , c);
    }

Will not work !
Why adding the & hurts?
Kobi.

On 4/27/06, Kobi Cohen-Arazi <kobi.cohenarazi@gmail.com > wrote:
OK.

Next stage:
define a small helper:
    std::string removeConst (const std::string& s)
    {
        return s;
    }

// define a ptr to member func std::string::replace

            std::string & (std::string::*rep)(std::string::size_type,
                                              std::string::size_type, const char *) = &std::string::replace;


// try to transform from
// but will not work. Compile fails
            std::transform( array.begin(), array(), std::back_inserter(tr),
                           boost::bind(rep,
                                       boost::bind(&removeConst, boost::bind(&Foo::get, _1)),
                                       0, 5, ""));

// however that will work, so I probably missing something up there
            std::transform(array.begin(), array(), std::back_inserter(tr),
                           boost::bind(&removeConst, boost::bind(&Foo::get, _1)));

Any idea?
Thanks,
Kobi.


On 4/27/06, Kobi Cohen-Arazi <kobi.cohenarazi@gmail.com> wrote:
Hi Sebastian,

Hmmm...... I think I know what the problem is ...
Foo::get is const

struct Foo{
   std::string get() const { ... }
};

So it is not a good candidate to use in string::replace.
I wonder how I can work around it, since I want to transform a _copy_ of that.
Is there a way to create a copy on the fly? something like:
...bind(rep, std::string(bind(&Foo::get, _1)), 0, 5, ""));

Thanks again for your insights.
Kobi.


On 4/27/06, Sebastian Redl <sebastian.redl@getdesigned.at> wrote:
Kobi Cohen-Arazi wrote:

> Hi,
>
> I've tried that, and I got a bunch of errors. I'm using boost::bind
> for that, not boost::lambda.
> Here is the error
>
> The following line:
> std::transform(array.begin(), array.end(), std::back_inserter(tr),
>   bind(&std::string::replace, bind(&Foo::get, _1), 0, 5, ""));
>
> generates:
> error: no matching function for call to 'bind(<unknown type>,
> boost::_bi::bind_t<const std::string&, boost::_mfi::cmf0<const
> std::string&, Foo>, boost::_bi::list1<boost::arg<1> > >, int,
> uint32_t&, const char [1])'

Hmmm ... the <unknown type> is suspicious. The problem might be that
&std::string::replace is ambiguous, as it is overloaded. Try this:

std::string & (std::string::*rep)(std::string::size_type,
std::string::size_type, const char *) = &std::string::replace;
std::transform(array.begin(), array.end(), std::back_inserter(tr),
  bind(rep, bind(&Foo::get, _1), 0, 5, ""));

Sebastian Redl
_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users