So I am currently writing a part of a program that takes user text input. I want to ignore all input characters that are not alphabetic, and so I figured std::isalpha() would be a good way to do this. Unfortunately, as far as I know there are two std::isalpha() functions, and the general one needs to be disambiguated from the locale-specific one thusly:
(int(*)(int))std::isalpha()
If I don’t disambiguate, std::isalpha seems to return true when reading uppercase but false when reading lowercase letters (if I directly print the returned value, though, it returns 0 for non-alpha chars, 1 for uppercase chars, and 2 for lowercase chars). So I need to do this.
I’ve done so in another program before, but for some reason, in this project, I sometimes get “ISO C++ forbids” errors. Note, only sometimes. Here is the problematic area of code (this appears together without anything in between):
std::cout << "Is alpha? " << (int(*)(int))std::isalpha((char)Event.text.unicode) << "\n";
if ( (int(*)(int))std::isalpha((char)Event.text.unicode) == true)
{
std::cout << "Is alpha!\n";
//...snip...
}
The first instance, where I send the returned value to std::cout, works fine – I get no errors for this, I get the expected values (0 for non-alpha, 1 for alpha), and if that’s the only place I try to disambiguate, the program compiles and runs fine.
The second instance, however, throws up this:
error: ISO C++ forbids comparison between pointer and integer
and only compiles if I remove the (int(*)(int)) snippet, at which point bad behavior ensues. Could someone enlighten me here?
You are casting the return value of the
std::alpha()call toint(*)(int), and then compare that pointer totrue. Comparing pointers to boolean values doesn’t make much sense and you get an error.Now, without the cast, you compare the
intreturned bystd::alpha()totrue.boolis an integer type, and to compare the two different integer types the values are first converted to the same type. In this case they are both converted toint.truebecomes1, and ifstd::isalpha()returned2the comparison ends up with2 != 1.If you want to compare the result of
std::alpha()against abool, you should cast that returned in tobool, or simply leave out the comparison and use something likeif (std::isalpha(c)) {...}