如何解决将无聊的switch语句列表转换成较短且令人愉悦的外观?
switch (abc) {
case FILE_0:
lf = m_a->olf[0];
kf = m_a->pkf[0];
break;
case FILE_1:
lf = m_a->olf[1];
kf = m_a->pkf[1];
break;
.
.
default:
LOG_ERR << "Wrong type to check";
return 0;
}
这种情况发生了大约30次,而我在这一次切换中就遇到了30个案例。 在C ++ 11中有什么方法可以缩短它吗?例如。使用模板。
解决方法
但是,从我的代码片段中可以看出,您的代码并不能确定意图,实际上,您实际上想将符号值转换为索引。 (我可以假设这是一个枚举吗?)
我要做的是将代码移至单独的函数中
auto fileEnumToIndex(FileEnum file) {
switch (file) {
case FILE_0: return 0;
case FILE_1: return 1;
default: __builtin_unreachable();
}
}
您的代码将更改为:
auto index = fileEnumToIndex(abc);
lf = m_a->olf[index];
kf = m_a->pkf[index];
如果FileEnum是一个真正的枚举,则可以将函数fileEnumToIndex中的代码更改为简单的static_cast
要覆盖默认情况,您可以返回std::optional
并使用std::nullopt
情况进行一些错误处理。但是,当FileEnum是实际的枚举时,确定该值时我将承担错误处理。
您可以创建abc
和索引的地图,并使用它来确定索引。
// somewhere,maybe outside functions
static const std::unordered_map<abc_type,int> table = {
{FILE_0,0},{FILE_1,1},...
};
// inside function
auto idx_itr = table.find(abc);
if (idx_itr != table.end()) {
lf = m_a->olf[*idx_itr];
kf = m_a->pkf[*idx_itr];
} else {
// default case
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。