Boost logo

Boost Users :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2002-09-23 06:09:58


From: "judoka1981" <johan.nilsson_at_[hidden]>
> Hi,
>
> I'm trying to find the first non-space character of a string using
> boost::bind, but I simply can't get this to compile:
>
> ---
>
> static void Trim(std::string& stringToTrim)
> {
> std::string::iterator firstNonSpace =
> std::find_if(stringToTrim.begin(),
> stringToTrim.end(),
> boost::bind(std::not_equal_to<int>(),
> boost::bind(&isspace, _1),
> 0));

This may or may not compile, depending on whether <locale> is included (it
contains a two-argument std::isspace), and depending on which isspace's are
in the global namespace (<ctype.h> vs <cctype>).

One possible fix is to use

int (*isspace)(int) = &std::isspace; // use the <cctype> isspace

but using isspace(ch) in this way isn't portable as char may be signed, the
portable use is isspace(static_cast<unsigned char>(ch)).

The other approach is

bool (*isspace)(char, std::locale const &) = &std::isspace; // use the
<locale> isspace

and change the inner bind to boost::bind(isspace, _1, l) where l is the
locale to use.

Also, you may consider using std::logical_not<bool> in the outer bind; on
MSVC.NET, due to lack of function template partial ordering, you'll need to
tell bind the return type, too: bind<bool>.


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