gpt4 book ai didi

c++ - 有没有办法在 std::array 之间切换

转载 作者:行者123 更新时间:2023-12-01 19:36:13 27 4
gpt4 key购买 nike

我有一些用 C 语言编写的遗留代码,我想用 C++14 进行重构。我遇到了一个我无法解决的问题。

在普通的旧 C 语言中,有一种方法可以在数组之间进行切换。

#define NELEMS(x)  (sizeof(x) / sizeof((x)[0]))

const int sz = (machine == 1) ? NELEMS (errors1) : NELEMS (errors2);
const struct Error *error = (machine == 1) ? &errors1[0] : &errors2[0];

上面的代码可以工作,但不知何故不可读。我想使用std::array因为它可以通过更少且更具可读性的代码轻松操作。 std::vector使用堆内存,我希望结果是可 ROMable 的。

C++ 代码三元运算符 const Error &error = (machine == 1) ? errors1 : errors2; 它不能这样使用,因为 std::array<Error, 3> errors1std::array<Error, 5> errors2是不同类型的!那么如何使用 std::array 实现相同的功能?

旧版 C 代码

enum ErrorCode {

  ERR_NOT_FOUND,
  ERR_FORBIDDEN,
  ERR_INTERNAL,
  ERR_UNAVAILABLE,
  ERR_NO_RESPONSE,
  ERR_UNSUPPORTED,
  ERR_OUT_OF_MEMORY,
  ERR_TIMEOUT
};

struct Error {
  int id;
  int code;
  const char *str;
};



static const struct Error errors1[] = {
    {1001, ERR_NOT_FOUND, "Not Found"},
    {1002, ERR_FORBIDDEN, "Forbidden"},
    {1003, ERR_INTERNAL, "Internal Error"}
};



static const struct Error errors2[] = {
  {1004, ERR_UNAVAILABLE, "Temporarly Unavailable"},
  {1005, ERR_NO_RESPONSE, "No Response"},
  {1006, ERR_UNSUPPORTED, "Unsupported"},
  {1007, ERR_OUT_OF_MEMORY, "Insufficient Memory"},
  {1008, ERR_TIMEOUT, "Timeout"}
};

#define NELEMS(x)  (sizeof(x) / sizeof((x)[0]))

char *error_to_string (char machine, int id) {
    const int sz = (machine == 1) ? NELEMS (errors1) : NELEMS (errors2);
    const struct Error *error = (machine == 1) ? &errors1[0] : &errors2[0];
    const char *str = "Unknown";

    for (int i = 0; i < sz; i++) {
    if (error[i].id == id) {
        str = error[i].str;
        break;
    }
    }
return str;
}

尝试实现现代 C++ 代码,其功能与 C 代码相同

std::array<Error, 3> errors1= {{
    {1001, ERR_NOT_FOUND, "Not Found"},
    {1002, ERR_FORBIDDEN, "Forbidden"},
    {1003, ERR_INTERNAL, "Internal Error"}
}};

std::array<Error, 5> errors2= {{
  {1004, ERR_UNAVAILABLE, "Temporarly Unavailable"},
  {1005, ERR_NO_RESPONSE, "No Response"},
  {1006, ERR_UNSUPPORTED, "Unsupported"},
  {1007, ERR_OUT_OF_MEMORY, "Insufficient Memory"},
  {1008, ERR_TIMEOUT, "Timeout"}
}};

const char *error_to_string (char machine, int id) {
const char *str = (char*) "Unknown";
    const auto errors = (machine == 1) ? &errors1[0] : &errors2[0];

     for (auto error : errors) {
        if (error.id == id) {
        str = error.str;
        break;
    }
    }
  return str;
}

最佳答案

您可以使用 lambda 来搜索给定数组中的错误。

const char *error_to_string(const char machine, const int id) {
const auto find_error = [id](const auto &errors) {
for (const Error &error : errors) {
if (error.id == id) return error.str;
}
return "Unknown";
};
return machine == 1 ? find_error(errors1) : find_error(errors2);
}

要将其扩展到多个数组,只需使用开关

const char *error_to_string(const char machine, const int id) {
const auto find_error = [id](const auto &errors) {
for (const Error &error : errors) {
if (error.id == id) return error.str;
}
return "Unknown";
};
switch (machine) {
case 1: return find_error(errors1);
case 2: return find_error(errors2);
case 3: return find_error(errors3);
// ...
}
// probably want to handle this properly
assert(false);
return "Invalid machine";
}

关于c++ - 有没有办法在 std::array 之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58970370/

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