Class-scoped enum

Class-scoped enum

本文关键字:enum Class-scoped      更新时间:2023-10-16

我有一个c++类,里面有一个enum,我想用boost::python模仿它,这样我就可以用python写MyClass.valueboost::python::class_没有enum_方法,我正在寻找解决方案。

  1. 我第一次尝试使用像

    这样的lambda
    MyClass{
        enum{value1,value2};
    };
    class_<MyClass>("MyClass").add_property("value1",&[](){return value1;}).staticmethod("value1");
    

    导致编译错误(get_signatureadd_property)。我知道我可以为每个值创建getter方法,但这对我来说似乎很尴尬(类型方面)。

  2. Using attr:

    auto classObj=class_<MyClass>("MyClass");
    classObj.attr("value1")=(int)value1;
    classObj.attr("value2")=(int)value2;
    
  3. 不能像.def和其他返回实例引用的方法那样链接。

有更优雅的解决方案吗?

可以使用作用域:

#include <boost/python/module.hpp>
#include <boost/python/class.hpp>
#include <boost/python/scope.hpp>
#include <boost/python/enum.hpp>
namespace bp = boost::python;
class MyClass{
    public:
        enum MyEnum {value1,value2};
};
BOOST_PYTHON_MODULE(nestedtest){
    bp::scope the_scope
        = bp::class_<MyClass>("MyClass")
        ;
    bp::enum_<MyClass::MyEnum>("MyEnum")
        .value("value1", MyClass::value1)
        .value("value2", MyClass::value2)
        .export_values()
        ;
}

那么在python中,枚举值是:

In [8]: nestedtest.MyClass.MyEnum.values
Out[8]: {0: nestedtest.MyEnum.value1, 1: nestedtest.MyEnum.value2}
In [9]: nestedtest.MyClass.MyEnum.value1
Out[9]: nestedtest.MyEnum.value1
In [10]: nestedtest.MyClass.MyEnum.value2
Out[10]: nestedtest.MyEnum.value2

(从我的python shell中,我测试了这个和所有;)