【发布时间】:2018-11-21 15:18:17
【问题描述】:
我有一些函数可以返回成功或一组固定的错误代码。为了识别错误代码,我(类似于)声明了这个老式 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:: 很乏味,并且使代码更难阅读,并且没有真正增加太多价值(因为 RESULT_SUCCESS 就我的目的而言已经足够独特了,无论如何)
我的问题是,是否有某种using namespace my_status_t; 样式指令可以用来告诉编译器将枚举值导出到它们的my_status_t 命名空间中,这样我就可以引用它们而无需键入@一直都是987654332@前缀?
【问题讨论】:
标签: c++ c++11 enums namespaces