假设我有一堆众所周知的值,就像这样(但这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 中类似地表达这一点?
请注意,返回类型本身是丑陋的(几乎和lambda 表达式的返回类型一样丑陋),所以我当然不想将它存储在局部变量中。
但是返回类型不必与常量匹配——例如,如果返回类型是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?