Лучший способ сказать 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?