pybind11:枚举与枚举 Class?

pybind11: Enum vs Enum Class?

我理解枚举和枚举之间的区别 类 在 C++ 上下文中,但是在绑定枚举和枚举的上下文中 类 有什么真正的区别吗?

比如说:

enum class options {
  maybe,
  yes,
  no,
};

enum words {
   hello,
   world
};

我只是以相同的方式绑定它们(见下文),所以我的问题是,我是否忽略了某些东西,或者枚举和枚举 类 在将它们绑定到 python 与 pybind11?

py::enum_<options>(m, "options")
    .value("maybe", options::maybe)
    .value("yes", options::yes)
    .value("no", options::no);

py::enum_<words>(m, "words")
    .value("hello", words::hello)
    .value("world", words::world)

根据 docs,看来唯一的区别是:

The enum_::export_values() function exports the enum entries into the parent scope, which should be skipped for newer C++11-style strongly typed enums.

因此,通过 not 调用 export_values,Python 将在指定值时要求将枚举名称作为范围的一部分,这在概念上更接近 enum classenum.

值得注意的是 Python 的 Enum 不允许像 C++ 的 enum 那样的隐式 int 转换。为此,您需要 IntEnum - 但我不确定您是否可以从 pybind 创建 IntEnums。