首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使匿名枚举成为正确类型的包装器

使匿名枚举成为正确类型的包装器
EN

Stack Overflow用户
提问于 2020-01-28 17:47:49
回答 2查看 142关注 0票数 0

我有一些来自c-code的typedef'd枚举,也就是说,它们在下面的形式中可用

代码语言:javascript
复制
typedef enum {FOO=3, BAR=5} my_enum; 

我想以一种类型安全的方式在C++代码中使用它,同时保持enum名称(FOO和BAR)、值(3和5)及其关联不变。

在C++11或更高版本中,有没有可以推荐的最佳实践或模式,比如模板包装器?

EN

回答 2

Stack Overflow用户

发布于 2020-01-28 19:14:41

在C++11以后的版本中,您可以将这些类型声明为枚举,以获得类型安全性,但您必须使用enum class的名称来限定使用。

代码语言:javascript
复制
enum class my_enum {
    FOO=3,
    BAR=5
};

void my_func(my_enum e) {

}

int main() {
  my_enum test_enum = my_enum::FOO;
  my_func(test_enum);
}

如果我们将上面的test_enum定义改为my_enum test_enum = FOO;,我们会得到错误:

13:23: error: 'FOO' was not declared in this scope

票数 0
EN

Stack Overflow用户

发布于 2020-01-28 20:24:24

它看起来像是一个

代码语言:javascript
复制
using

声明可以工作;至少可以编译以下代码:

代码语言:javascript
复制
#include <iostream>

typedef enum{A=0, B=1, C=2} my_enum;
typedef enum{H=0, I=1, J=2} your_enum;

using namespace std;
using my_wrapper = my_enum;
using your_wrapper = your_enum;

int g(my_wrapper w)
{
    return (int)w-10;
}

int g(your_wrapper w)
{
    return (int)w+10;
}


int main() {
    my_wrapper b=my_wrapper::B;
    your_wrapper j=your_wrapper::J;
    cout << g(b) << "\n";
    cout << g(j) << "\n";
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59945987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档