首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++11开关语句中使用原子枚举类

在C++11开关语句中使用原子枚举类
EN

Stack Overflow用户
提问于 2022-10-11 13:34:40
回答 1查看 71关注 0票数 1

不确定这是可能的,但如果可能,如何在C++11中为开关语句使用原子枚举类?例如,

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

enum class A {RED, FRUIT, APPLE};

int main(){
    std::atomic<A> myAtomicEnum;
    myAtomicEnum = A::RED;
    switch (myAtomicEnum){
        case A::RED:
            std::cout << "A::RED \n";
            break;
        default:
            break;
    }
    return 0;
}

给出编译器错误

代码语言:javascript
复制
error: multiple conversions from switch condition type
      'std::atomic<A>' to an integral or enumeration type
    switch (myAtomicEnum){

使用枚举类(而不是原子类)的不同问题强制使用一元+转换为算术类型,但不能将std::atomic<A>传递给一元+。我没有收到任何使用非原子枚举类和不使用一元+的错误。

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

enum class A {RED, FRUIT, APPLE};

int main(){
    A myEnum = A::RED;
    switch (myEnum){
        case A::RED:
            std::cout << "A::RED \n";
            break;
        default:
            break;
    }
    return 0;
}

它按预期输出A::RED

问题的上下文是,我有一个类,其成员可以由多个线程读取/写入,以及使用该成员的switch语句。我有一个解决办法,使用互斥-es,以便我有明确的行为,但如果可能的话,我想使用atomic

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-11 13:51:04

在C++ 11中,可以将原子类型变量显式转换为枚举类型,这将调用对象的std::atomic<T>::operator T()强制转换操作符:

代码语言:javascript
复制
switch ((A)myAtomicEnum){
    case A::RED:
        ...

顺便说一句,从C++ 14开始,不需要这种显式强制转换,转换到切换类型的转换将隐式地执行(cppreference.com,隐式转换页面)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74029014

复制
相关文章

相似问题

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