Лучший способ сказать x == Foo :: A || x == Foo :: B || x == Foo :: C || ...?

Допустим, у меня есть несколько общеизвестных значений, таких какconst char * это просто пример, это может быть сложнее):

const char *A = "A", *B = "B", *C = "C", *D = "D", *E = "E", *F = "F", *G = "G";

Теперь предположим, что я хочу вести себя определенным образом, если результат какого-либо выражения находится в подмножестве из них:

if (some_complicated_expression_with_ugly_return_type == A ||
    some_complicated_expression_with_ugly_return_type == C ||
    some_complicated_expression_with_ugly_return_type == E ||
    some_complicated_expression_with_ugly_return_type == G)
{
    ...
}

Я часто напечатаю подобные вещи, и мне бы хотелось, чтобы они были сокращены.

Если бы язык был Python, я мог бы легко сказать:

if some_complicated_expression_with_ugly_return_type in [A, C, E, G]:
    ...

Есть ли хорошо известный, переносимый для меня способ выразить это подобным образом в C ++ 03?

Обратите внимание, что возвращаемый тип сам по себе уродлив (почти так же уродлив, как и возвращаемый типлямбда-выражения), поэтому я, конечно, не хочу хранить его в локальной переменной.

Но тип возврата делаетnot должны соответствовать константы - например, если тип возвращаемого значения былstd::stringбыло быnot быть неявно конвертируемым вconst char *, ноoperator == было бы прекрасно для сравнения.

Пока что лучшее решение, которое у меня есть, это сказать что-то вроде:

const char *items[] = { A, C, E, G };
if (std::find(items, items + sizeof(items) / sizeof(*items),
              some_complicated_expression_with_ugly_return_type)
    != items + sizeof(items) / sizeof(*items))
{
    ...
}

но это чертовски ужасно. Есть ли лучший способ, который также работает для не POD?

Ответы на вопрос(8)

Ваш ответ на вопрос