Lepszy sposób powiedzenia x == Foo :: A || x == Foo :: B || x == Foo :: C || …
Powiedzmy, że mam kilka dobrze znanych wartości, takich jak ta (aleconst char *
to tylko przykład, może być bardziej skomplikowany):
const char *A = "A", *B = "B", *C = "C", *D = "D", *E = "E", *F = "F", *G = "G";
Powiedzmy, że chcę zachowywać się w określony sposób, jeśli wynik jakiegoś wyrażenia znajduje się w podzbiorze tych:
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)
{
...
}
Często piszę takie rzeczy, że chciałbym dla nich skrót.
Jeśli językiem był Python, z łatwością mógłbym powiedzieć:
if some_complicated_expression_with_ugly_return_type in [A, C, E, G]:
...
Czy istnieje znany, przenośny sposób wyrażania tego podobnie w C ++ 03?
Zwróć uwagę, że typ powrotu jest brzydki (prawie tak brzydki jak typ powrotuwyrażenia lambda), więc z pewnością nie chcę przechowywać go w zmiennej lokalnej.
Ale typ zwrotu manie muszą pasować do stałych - na przykład, jeśli typem powrotu byłstd::string
, byłobynie być niejawnie wymienialny naconst char *
, aleoperator ==
byłoby idealnie w porządku dla porównania.
Jak dotąd najlepszym rozwiązaniem, jakie mam, jest powiedzenie czegoś takiego:
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))
{
...
}
ale to jest dość brzydkie. Czy jest lepszy sposób, który działa także w przypadku systemów innych niż POD?