gpt4 book ai didi

c++ - 替代长 switch 语句

转载 作者:行者123 更新时间:2023-11-30 01:46:46 25 4
gpt4 key购买 nike

只是想知道是否有更简洁的方法来执行此操作。用户将调用 setFullScaleRange1setFullScaleRange2。他们将设置的范围值只是整数形式。然后进入 switch 语句并转换为十六进制值。我不希望用户必须发送十六进制值,所以这就是为什么我采用这种迂回的方式来做这件事。有更有效的方法吗?

void label::setFullScaleRange1(uint16_t range)
{
uint8_t data = 0;
uint8_t user_range = 0;
user_range = get_user_range(range, true);
data = SET_SLICE(data, REG_TEST1, user_range);
spi_reg_write(data, REG_CONFIG);
}

void label::setFullScaleRange2(uint16_t range)
{
uint8_t data = 0;
uint8_t user_range = 0;
user_range = get_user_range(range, false);
data = SET_SLICE(data, REG_TEST2, user_range);
spi__write(data, REG_CONFIG);
}


static uint8_t get_user_range(uint16_t range, bool test_range)
{
if(test_range) {
switch(range) {
case 125:
range = SET_125_DEG_SEC;
break;
case 250:
range = SET_250_DEG_SEC;
break;
case 500:
range = SET_500_DEG_SEC;
break;
case 1000:
range = SET_1000_DEG_SEC;
break;
case 2000:
range = SET_2000_DEG_SEC;
break;
default:
return 1;
}
} else {
switch(range) {
case 2:
range = SET_2G;
break;
case 4:
range = SET_4G;
break;
case 8:
range = SET_8G;
break;
case 16:
range = SET_16G;
break;
default:
return 1;
}
}
return range;
}

最佳答案

在C++中,你可以给出get_user_range static 的数组存储要返回的各种常量的映射

#include <cstdint>
#include <iostream>
#include <map>

enum E1 { SET_125_DEG_SEC = 125, SET_250_DEG_SEC = 250, SET_500_DEG_SEC = 500, SET_1000_DEG_SEC = 1000, SET_2000_DEG_SEC = 2000 };
enum E2 { SEG_2G = 2, SEG_4G = 4, SEG_8G = 8, SEG_16G = 16 };

static int get_user_range(uint16_t range, bool test_range)
{
static std::map<uint16_t, int> switch_map[2] =
{
{
{ 125, SET_125_DEG_SEC },
{ 250, SET_250_DEG_SEC },
{ 500, SET_500_DEG_SEC },
{ 1000, SET_1000_DEG_SEC },
{ 2000, SET_2000_DEG_SEC }
},
{
{ 2, SEG_2G },
{ 4, SEG_4G },
{ 8, SEG_8G },
{ 16, SEG_16G }
}
};

auto const& m = switch_map[test_range];
auto it = m.find(range);
if (it != m.end()) {
return it->second;
}

return 1;
}

int main()
{
std::cout << get_user_range(500, false) << '\n';
std::cout << get_user_range( 16, false) << '\n';
std::cout << get_user_range(500, true) << '\n';
std::cout << get_user_range( 16, true) << '\n';
}

Live Example .

这段代码的作用是用 bool 值 test_range 索引 map 数组。 .然后给定正确的 map ,它将调用其 find具有整数的成员函数 range .如果此函数返回一个迭代器(如果您来自 C,则基本上是一个指针)等于映射末尾后的一个,则它没有找到您要查找的内容。如果是这种情况,则返回 1。否则,取消对迭代器的引用,它会给出 std::pair<uint16_t, int>。 struct,然后你取 .second它的数据成员,其中包含您想要的值。

您可以轻松地将其转换为 C 风格的数组,您可以在其中执行类似的操作。但是您必须更加努力地搜索数据。

请注意,我将返回类型更改为 int为了能够为各种枚举常量赋予自然值。

关于c++ - 替代长 switch 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32649872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com