Melhor maneira de dizer x == Foo :: A || x = = Foo :: B || x = = Foo :: C || …?

Digamos que eu tenha vários valores conhecidos, como esse (masconst char * é apenas um exemplo, poderia ser mais complicado):

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

Agora digamos que eu quero me comportar de uma maneira particular se o resultado de alguma expressão estiver em um subconjunto daqueles:

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)
{
    ...
}

Eu me pego digitando esse tipo de coisa com freqüência suficiente que eu gostaria de uma abreviação para isso.

Se a linguagem fosse Python, eu poderia facilmente dizer:

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

Existe uma maneira bem conhecida e portátil para expressar isso de forma semelhante em C ++ 03?

Note que o tipo de retorno é em si feio (quase tão feio quanto o tipo de retornoexpressões lambda), então eu certamente não quero armazená-lo em uma variável local.

Mas o tipo de retornonão tem que coincidir com as constantes - por exemplo, se o tipo de retorno foistd::string, serianão ser implicitamente conversível paraconst char *, masoperator == estaria perfeitamente bem para a comparação.

Até agora, a melhor solução que tenho é dizer algo como:

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))
{
    ...
}

mas é muito feio. Existe uma maneira melhor, que também funciona para não-PODs?

questionAnswers(8)

yourAnswerToTheQuestion