类作用域枚举

16

我有一个包含枚举的C++类,我想使用boost::python来模拟它,这样我就可以在Python中编写MyClass.value。但是boost::python::class_没有enum_方法,我正在寻找解决方法。

  1. 我首先尝试使用lambda函数,例如

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

    add_propertyget_signature中出现了编译错误。我知道我可以为每个值创建getter方法,但这样做对我来说似乎非常笨拙(从打字的角度考虑)。

  2. 使用attr

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

    但是它不能像.def和其他返回实例引用的方法那样被链接。

    有没有更优雅的解决方案?


MyClass 之外,您需要像 MyClass::value1 这样引用枚举值,尽管我对 boost-python 的东西不太熟悉。 - Tom Kerr
+1 鼓励你认真格式化这段内容。 - Lightness Races in Orbit
1个回答

13

您可以使用作用域(scope)来实现此操作:

#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 中测试了这个,并且一切都没问题 ;)


1
枚举是嵌套的,这不是我想要的;如果没有额外的价值,键入“。MyEnum”会非常讨厌和不可读。 - eudoxos
3
如果您的 enum 值都是 ThingyAThingyBThingyC,那么添加的价值在于将它们作为 Thingy.AThingy.BThingy.C 暴露给 Python。作为一个反对命名空间污染和相关全局命名空间臭氧空洞等问题的人,我很重视这个特性 ;) - James
1
这是一个观点问题(我不同意),无论如何,问题要求获取 MyClass.value - eudoxos
1
你可以通过为每个枚举值添加以下行来获得所需的行为(假设与上面相同的代码)。这将向“正确”的作用域中注入一个新符号,其值为您想要的值。the_scope.attr("value1") = MyClass::value1; - tgoodhart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接