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?