Given string foo, I've written answers on how to use cctype's tolower to convert the characters to lowercase
transform(cbegin(foo), cend(foo), begin(foo), static_cast<int (*)(int)>(tolower))
But I've begun to consider locale's tolower, which could be used like this:
use_facet<ctype<char>>(cout.getloc()).tolower(data(foo), next(data(foo), foo.size()));
tolower accepts and returns an int which I assume is just some antiquated C stuff?It should be noted that the language designers were aware of cctype's tolower when locale's tolower was created. It improved in 2 primary ways:
locale version allowed the use of the facet ctype, even a user modified one, without requiring the shuffling in of a new LC_CTYPE in via setlocale and the restoration of the previous LC_CTYPEIt is implementation-defined whether objects of
chartype are represented as signed or unsigned quantities. Thesignedspecifier forcescharobjects to be signed
Which creates an the potential for undefined behavior with the cctype version of tolower's if it's argument:
Is not representable as
unsigned charand does not equalEOF
So there is an additional input and output static_cast required by the cctype version of tolower yielding:
transform(cbegin(foo), cend(foo), begin(foo), [](const unsigned char i){ return tolower(i); });
Since the locale version operates directly on chars there is no need for a type conversion.
So if you don't need to perform the conversion in a different facet ctype it simply becomes a style question of whether you prefer the transform with a lambda required by the cctype version, or whether you prefer the locale version's:
use_facet<ctype<char>>(cout.getloc()).tolower(data(foo), next(data(foo), size(foo)));