类范围的枚举

时间:2011-08-31 07:49:26

标签: c++ enums static-members boost-python

我有一个带有枚举的c ++类,我想用boost::python来模仿它,这样我就可以在python中编写MyClass.valueboost::python::class_没有enum_方法,我正在寻找解决方法。

  1. 我首先尝试使用像

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

    会产生编译器错误(get_signatureadd_property)。我知道我可以为每个值创建getter方法,但这对我来说似乎很尴尬(打字方式)。

  2. 使用attr

    auto classObj=class_<MyClass>("MyClass");
    classObj.attr("value1")=(int)value1;
    classObj.attr("value2")=(int)value2;
    

    但它不能像.def那样被链接,并且其他方法会返回对实例的引用。

  3. 有更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:13)

您可以使用范围:

#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

(来自我的ipython shell,我测试了这一切以及所有;)