gpt4 book ai didi

c++ - 只允许枚举的一个子集作为返回值——或者如何让编译器提醒我?在 C++ 中

转载 作者:行者123 更新时间:2023-11-30 04:12:43 24 4
gpt4 key购买 nike

我的目标

我有多个函数会返回一个错误代码的大列表。某些函数将使用“错误代码列表”中相同且不同的错误代码

  • 例如:
    • fun1() 将仅返回 errorcode1errorcode2(errorcode2 仅在此函数中使用)
    • fun2() 将仅返回 errorcode1errorcode3(但 errorcode1 用于两个函数)

理想的解决方案应考虑以下几点: -

  • 定义哪个函数可以返回什么错误码

  • 如果任何函数试图返回一个不适合该函数的错误代码,则会出现编译错误

  • 无论函数 return 还是 throws 都必须可转换为 int(因为这些函数将成为 C API 的一部分)

我的方法

到目前为止,我考虑过使用枚举的选项,但这些解决方案对我没有吸引力

  1. 为每个函数定义一个单独的枚举
  2. 为所有函数定义一个全局枚举

为每个函数定义一个单独的枚举

enum errorcodefun1 {errorcode1=1, errorcode2=2};               // OK at least it is expressed what is expected for fun1
errorcodefun1 fun1() { };
enum errorcodefun2 {errorcode1_fun2=1, errorcode3_fun2=3 }; // minor problem: not expressing that errorcode1_fun2 is logical same as errorcode1

函数越多(部分使用相同的错误代码)我得到的代码重复越多。

为所有函数定义一个枚举

enum errorcodes {errorcode1=1, errorcode2=2, errorcode3=3};
errorcode fun1() {... } //do not like because I will get no compilation error if it returns errorcode3. Only errorcode1 and errocode2 is intended
errorcode fun2() {... }

我的问题

我正在考虑编写一个模拟枚举的类,但到目前为止我看到了满足我所有需求的解决方案。

您对如何实现我的目标有什么建议或想法吗?

最佳答案

如何使用方法 1,但保持安全并表达枚举成员的等价性?

enum generic_error {
ERR_OK,
ERR_NOMEM,
ERR_IO,
ERR_GENERIC
};

enum first_error {
FIRSTERR_OK = ERR_OK,
FIRSTERR_NOMEM = ERR_NOMEM
};

enum second_error {
SECONDERR_OK = ERR_OK,
SECONDERR_IO = ERR_IO
};

int main()
{
enum first_error f = FIRSTERR_OK;
enum second_error s = SECONDERR_OK;
assert(f == s); // never fires
return 0;
}

虽然这并不是特别好的做法......如果我是你,我真的只会选择一个常见的错误代码枚举。

关于c++ - 只允许枚举的一个子集作为返回值——或者如何让编译器提醒我?在 C++ 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19727160/

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