How can I better check whether two char variables are in some set of values?

You typically use tolower or toupper to convert your char variable to the correct case first. I like using tolower - it looks marginally better.

dayOne = tolower(dayOne);
dayTwo = tolower(dayTwo);

while (
    (dayOne != 'm' || dayTwo != 'o') &&
    (dayOne != 't' || dayTwo != 'u') &&
    (dayOne != 'w' || dayTwo != 'e') &&
    (dayOne != 't' || dayTwo != 'h') &&
    (dayOne != 'f' || dayTwo != 'r') &&
    (dayOne != 's' || dayTwo != 'a') &&
    (dayOne != 's' || dayTwo != 'u'))
{
    ...
}

You can further change it by using memcmp to compare both characters at once, but I am not sure it would simplify the code.


You could write a fold-expression that compares 2 characters to a string:

template<typename ...Days>
bool any_of(char a, char b, Days ...days)
{
    return (... || (a == days[0] && b == days[1]));
}

and then use it like this:

while (! any_of(std::tolower(dayOne), std::tolower(dayTwo), "mo", "tu", "we", "th", "fr", "sa", "su"))
    // keep asking for input

Here's a demo.

This should satisfy the requirement of using 2 char inputs.

Tags:

C++