このようなよく知られた値がたくさんあるとしましょう(ただし、これ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で同様に表現するための、よく知られたポータブルな方法はありますか?
戻り型自体が醜い(ラムダ式の戻り型とほぼ同じくらい醜い)ので、ローカル変数に格納したくないことに注意してください。
ただし、戻り型は定数の型と一致する必要はありません。たとえば、戻り型がである場合、暗黙的にに変換するstd::string
ことはできません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でも機能するより良い方法はありますか?