只允许枚举的子集作为返回值 - 或 如何让编译器提醒我?在C++
Only allow a subset of an enum as return value - OR How to get the compiler to alert me ? in C++
我的目标
我有多个函数将返回一个大的错误代码列表。某些函数将使用"错误代码列表"的相同且不同的错误代码
- 例如:
-
fun1()
只会返回errorcode1
或errorcode2
(错误代码 2 仅用于此函数) -
fun2()
只会返回errorcode1
ORerrorcode3
(但两个函数都使用了错误代码 1)
-
所需的解决方案应考虑以下几点: -
-
定义哪个函数可以返回哪些错误代码
-
如果任何函数尝试返回不适用于此函数的错误代码,则获取编译错误
- 无论函数返回或抛出什么,都必须可转换为 int(因为这些函数将成为 C API 的一部分)
我的方法
到目前为止,我考虑了使用枚举的选项,但解决方案对我没有吸引力
- 为每个函数定义一个单独的枚举
- 为所有函数定义一个全局枚举
为每个函数定义一个单独的枚举
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;
}
不过,这并不是说这将是特别好的做法...如果我是你,我真的会选择一个常见的错误代码枚举。
使用位掩码。
enum Code : unsigned int
{
None = 0,
SomeError= 1,
AnotherError = 2,
YetAnotherError = 4
};
unsigned int valid_error_codes_for_func1 = SomeError | YetAnotherError;
相关文章:
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- Win32编译器选项和内存分配
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 在线编译器中的分段C++没有打印消息
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 我需要知道编译器如何在cpp中使用析构函数
- 编译器如何区分std::vector的构造函数
- CLANG 编译器 说:变量"PTR"可能未初始化
- 告诉c++编译器该参数没有别名
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么所有C++编译器都会崩溃或挂起此代码
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 为什么C++编译器没有检测到正确声明的类?