Скажем, у меня есть куча хорошо известных значений, вроде этого (но 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]:
...
Есть ли известный, переносимый способ выразить это аналогично в С++ 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?