gpt4 book ai didi

c++ - 有没有一种方法可以指定一个枚举类值而不必每次都输入它的范围?

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

我有一些函数可以返回成功或一组固定的错误代码。为了识别错误代码,我声明了(类似于)这个老式的 C 风格枚举:

enum {
RESULT_ERROR_BAD_PARAMETER = -3,
RESULT_ERROR_FILE_NOT_FOUND = -2,
RESULT_ERROR_GENERAL = -1,
RESULT_SUCCESS = 0
};
typedef int my_status_t;

my_status_t MyFunc(); // returns a RESULT_* value

这很有效;调用模式类似于:

if (MyFunc() != RESULT_SUCCESS) printf("Error!\n");

...然而,允许将 my_status_t 值隐式转换为 int/bool/etc 是令人不安的宽容,允许像这样的粗心错误:

// Compiles but does the wrong thing at run-time -- bad!
if (MyFunc() == false) printf("Error!\n");

...所以在我的新代码修订版中,我将其转换为 enum class:

enum class my_status_t {
RESULT_ERROR_BAD_PARAMETER = -3,
RESULT_ERROR_FILE_NOT_FOUND = -2,
RESULT_ERROR_GENERAL = -1,
RESULT_SUCCESS = 0
};

...从编译时检查的角度来看,这非常有效;现在大多数无意的类型提升都被编译器捕获,迫使程序员返回并以正确的方式进行。

唯一困扰我的是新语法很乏味:现在我不得不写这样的东西:

if (MyFunc() != my_status_t::RESULT_SUCCESS) printf("Error!\n");

... 在每个调用点——每次都必须输入 my_status_t:: 很乏味并且使代码更难阅读,并没有真正增加太多值(value)(因为 RESULT_SUCCESS 对于我的目的来说是足够独特的,无论如何)

我的问题是,是否有某种using namespace my_status_t; 样式指令我可以用来告诉编译器从它们的my_status_t 命名空间中导出枚举值, 这样我就可以引用它们而不必一直键入 my_status_t:: 前缀?

最佳答案

如果你要输入比那里更多的令人讨厌的范围前缀是 enum class 中的常量,那么它可能值得您花时间去做方式:

enum class result {
ERROR_BAD_PARAMETER = -3,
ERROR_FILE_NOT_FOUND = -2,
ERROR_GENERAL = -1,
SUCCESS = 0
};

constexpr result RESULT_ERROR_BAD_PARAMETER = result::ERROR_BAD_PARAMETER;
constexpr result RESULT_FILE_NOT_FOUND = result::ERROR_FILE_NOT_FOUND;
constexpr result RESULT_ERROR_GENERAL = result::ERROR_GENERAL;
constexpr result RESULT_SUCCESS = result::SUCCESS;

result foo() {
return RESULT_SUCCESS;
}

int main()
{
switch (foo())
{
case RESULT_SUCCESS:
;
}
// ^ warning: enumeration value ‘...’ not handled in ...

if (foo() == RESULT_SUCCESS) {
return 0;
}

/* error: no match for ‘operator==’
if (foo() == false) {
return -1;
}
*/
}

(g++ -Wall -Wextra -pedantic -std=c++11)

关于c++ - 有没有一种方法可以指定一个枚举类值而不必每次都输入它的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53415177/

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