【发布时间】:2012-08-27 17:31:03
【问题描述】:
假设我有一堆众所周知的值,像这样(但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 expressions 的返回类型一样丑陋),所以我当然不想将它存储在局部变量中。
但是返回类型不一定必须与常量的类型匹配——例如,如果返回类型是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?
【问题讨论】:
-
Isn't switch (some_complicated_expression_with_ugly_return_type) { case A: case B: case E: do something;break; } 够了吗?
-
仅适用于整数类型,它们并不难看,所以这里可能不存在。
-
@Benjamin:这仅适用于整数类型,就像 Pete 所说的那样。
-
在“最佳解决方案”中,包括返回类型。如果在那里可以接受,为什么它不能被变量接受?
-
@Benjamin:好的,我会修改示例,感谢您的反馈。