微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将无聊的switch语句列表转换成较短且令人愉悦的外观?

如何解决将无聊的switch语句列表转换成较短且令人愉悦的外观?

我有一个这样运行的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 举报,一经查实,本站将立刻删除。