标签: enum-class

为什么定义与枚举类冲突?

这是发生冲突的一小段代码。有什么方法可以正确解决这个问题吗?

#define DEBUG 0

enum class TypeEnum : int
{
    DEBUG = 0,
    INFO = 1
};
Run Code Online (Sandbox Code Playgroud)

c++ enum-class

3
推荐指数
1
解决办法
603
查看次数

Is using enum class for flags undefined behavior?

I've been using overloaded operators as demonstrated in the second answer from here: How to use C++11 enum class for flags ... example:

#define ENUMFLAGOPS(EnumName)\
[[nodiscard]] __forceinline EnumName operator|(EnumName lhs, EnumName rhs)\
{\
    return static_cast<EnumName>(\
        static_cast<std::underlying_type<EnumName>::type>(lhs) |\
        static_cast<std::underlying_type<EnumName>::type>(rhs)\
        );\
}...(other operator overloads)

enum class MyFlags : UINT //duplicated in JS
{
    None = 0,
    FlagA = 1,
    FlagB = 2,
    FlagC = 4,
};
ENUMFLAGOPS(MyFlags)
Run Code Online (Sandbox Code Playgroud)

...

MyFlags Flags = MyFlags::FlagA | MyFlags::FlagB;
Run Code Online (Sandbox Code Playgroud)

And I've grown concerned that this may be …

c++ undefined-behavior enum-class c++20

3
推荐指数
1
解决办法
245
查看次数

DRY:C++11 枚举类与 C 枚举

我有这样的课程:

struct InsertResult{
    enum class Status{
        INSERTED            ,
        UPDATED_IN_PLACE    ,
        REPLACED            ,
        SKIP_INSERTED       ,
        ERROR_NO_MEMORY     ,
        ERROR_INVALID       ,
        ERROR
    };

    bool        ok;
    Status      status;
    // more members here...

    // spill the enum:
    constexpr static auto INSERTED          =  Status::INSERTED         ;
    constexpr static auto UPDATED_IN_PLACE  =  Status::UPDATED_IN_PLACE ;
    constexpr static auto REPLACED          =  Status::REPLACED         ;
    constexpr static auto SKIP_INSERTED     =  Status::SKIP_INSERTED    ;
    constexpr static auto ERROR_NO_MEMORY   =  Status::ERROR_NO_MEMORY  ;
    constexpr static auto ERROR_INVALID     =  Status::ERROR_INVALID    ;
    constexpr static auto ERROR             =  Status::ERROR …
Run Code Online (Sandbox Code Playgroud)

c++ dry enum-class c++17

3
推荐指数
1
解决办法
144
查看次数

在模板函数中,如果输入的类型是枚举类,我该如何使用 std::underlying_type?

我有一段代码返回给定数字的某些位的值(我也使用 static_cast 将枚举类计算为一个数字)。

template<typename Type>
bool get_bits(Type input, uint8_t offset, uint8_t n, Type* destination)
{
    if (offset + n> sizeof(Type) * 8)
        return false;

    Type bitmask = 0;

    for (int i = 0; i < n; ++i)
        bitmask |= (1 << i);

    *destination = static_cast<Type>(input >> offset & bitmask);
    return true;
}
Run Code Online (Sandbox Code Playgroud)

该函数试图返回的值n的位input由开始offset。它适用于整数类型,但是当我尝试将它与枚举类一起使用时,编译失败。我尝试使用std::underlying_type然后它适用于枚举类但不适用于整数类型:|。我怎样才能将它用于他们两个?我的意思是,如果类型是枚举类,我想将输入转换为它的underlying_type,执行一些按位运算,然后将结果(使用static_cast)存储到目标。但是对于没有underlying_type 的整数类型,不应该进行这些转换。

c++ templates sfinae static-cast enum-class

2
推荐指数
1
解决办法
77
查看次数

typedef 枚举和枚举类有什么区别?

我可能遗漏了一些东西,但我正在使用一个使用大量

typedef enum foo
{
    ....
} foo;
Run Code Online (Sandbox Code Playgroud)

这与枚举类相同但不是强类型的吗?

c++ enums typedef enum-class

1
推荐指数
1
解决办法
500
查看次数

为什么构造函数未定义?

即使我正在使用Bukkit,这也是一个Java问题;

我不知道,为什么Java说构造函数是未定义的,因为它是定义的

import org.bukkit.entity.EntityType;
import net.minecraft.server.v1_10_R1.EntityCow;
import net.minecraft.server.v1_10_R1.EntityInsentient;

public enum Pets
{
    COW("Cow", 92, EntityType.COW, EntityCow.class, Pets.class);

    private String name;
    private int id;
    private EntityType et;
    private Class<? extends EntityInsentient> nmsClass;
    private Class<? extends EntityInsentient> customClass;

    Pets(String name, int id, EntityType et, Class<? extends EntityInsentient> nmsClass, Class<? extends EntityInsentient> customClass)
    {
        this.name = name;
        this.id = id;
        this.et = et;
        this.nmsClass = nmsClass;
        this.customClass = customClass;
    }

    public String getName()
    {
        return name;
    }
    public int getID()
    {
        return id; …
Run Code Online (Sandbox Code Playgroud)

java enums bukkit enum-class

0
推荐指数
1
解决办法
587
查看次数

C++ 11枚举类命名空间块

我有一个enum classC++ 11:

enum class eDays{ SUNDAY, MONDAY, /*...*/ };
Run Code Online (Sandbox Code Playgroud)

enum class这些值的命名空间,以便它有套使用,如:

eDays::SUNDAY
Run Code Online (Sandbox Code Playgroud)

我想设置一个名称空间块,所以我不需要每次都指定名称空间:

namespace eDays {
    vector<eDays> vec = { MONDAY, SUNDAY, /*...*/ };
}
Run Code Online (Sandbox Code Playgroud)

代替:

vector<eDays> vec = { eDays::MONDAY, eDays::SUNDAY, /*...*/ };
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

c++ namespaces c++11 enum-class

0
推荐指数
1
解决办法
78
查看次数

为什么不能将 int 类型的枚举类值用作 int

我想老式的改变enumenum class : int 由于其自身范围。

但是编译器抱怨在整数算术中使用这些值。但是为什么 - 因为枚举被显式输入为 int?

例子:

  enum class MsgType : int {
    Output = 1,
    Input  = 2,
    Debug  = 3
  };
  enum class MsgSender : int {
    A = 1,
    B = 2,
    C = 3
  };


  // later in code
  int id = (MsgType::Input << 16) + (MsgSender::A);
Run Code Online (Sandbox Code Playgroud)

产生

错误 C2678:二进制“<<”:未找到采用“MyClass::MsgType”类型的左侧操作数的运算符(或没有可接受的转换)

这对我来说似乎有些不合逻辑。

编辑:
我完全意识到投射它们的可能性。但是如果我不希望它们可以转换,为什么我要将类型指定为int. 特别是如果语法暗示某种“继承自int

c++ enum-class

0
推荐指数
1
解决办法
618
查看次数

为什么我们不能在 c++ 中将 enum 类的值打印为 enum

尝试打印枚举类对象时出错。我在尝试打印时遇到错误。我在哪里做错了?

#include <iostream>

using namespace std;

int main()
{

enum weekdays{sunday,monday,tuesday};
cout<<monday<<endl; // getting value as 1 as i expected.


enum class Weekday{sunday,monday,tuesday};
enum class Holiday{sunday,saturday};

Weekday wday=Weekday::monday; 

cout<<Weekday::monday<<endl; // getting error
cout<<wday<<endl; //getting error
return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ enums enum-class

0
推荐指数
1
解决办法
54
查看次数

GCC是否正确警告格式字符串与范围枚举不匹配?

当在varargs上下文中使用作用域枚举时,它被定义为作为其基础类型传递,如" 我可以使用枚举类值作为varargs函数的参数吗? "中所解释的那样.据我所知,这是唯一的情况,其中一个范围的枚举将被隐式转换,就像一个无范围的枚举.

考虑这个程序:

enum Foo : char { F };
enum class Bar : char { B };

#include <cstdio>
int main()
{
    return !std::printf("%c\n", Foo::F)
        +  !std::printf("%c\n", Bar::B);
}
Run Code Online (Sandbox Code Playgroud)

编译器(g++版本6.3.0)对a的第一个打印很满意Foo,但是当我传递时,抱怨Bar:

0.cpp: In function ‘int main()’:
0.cpp:10:34: warning: format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘Bar’ [-Wformat=]
         +  !printf("%c\n", Bar::B);
                                  ^
Run Code Online (Sandbox Code Playgroud)

g++版本4.8.2没有抱怨这个,但g++6.3.0确实(这就是为什么它现在关注我).当存在实质性不匹配时,两个版本都抱怨第一次打印,例如使用%f%s,或者如果我Foo改为使用long底层类型; 这就是我启用的原因-Wformat.

我知道警告不是标准一致性问题,我知道如何更改我的代码以解决这些问题(例如,在如何 …

c++ enums gcc-warning enum-class

-1
推荐指数
1
解决办法
185
查看次数

为什么不"cout << Color :: green"编译?

我在测试中遇到了这个问题.

我知道我可以这样做:

enum class Color { red, green = 1, blue };
Color c = Color::blue;

if( c == Color::blue )
cout << "blue\n";
Run Code Online (Sandbox Code Playgroud)

但是,当我更换cout << "blue\n";使用cout << Color::green,它甚至不进行编译.为什么不编译?

c++ enum-class

-2
推荐指数
1
解决办法
109
查看次数