
From: "judoka1981" <johan.nilsson@esrange.ssc.se>
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>.