【问题标题】:Class-scoped enum类范围的枚举
【发布时间】:2011-08-31 07:49:25
【问题描述】:

我有一个 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_signature 中,对于add_property)。我知道我可以为每个值创建 getter 方法,但这对我来说似乎很尴尬(打字方面)。

  2. 使用attr

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

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

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

【问题讨论】:

  • MyClass 之外,您需要引用MyClass::value1 之类的枚举值,尽管我的元素无法使用 boost-python 的东西。
  • +1 麻烦您正确格式化。

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


【解决方案1】:

您可以使用范围来做到这一点:

#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,我测试了这个和所有的;)

【讨论】:

  • 枚举是嵌套的,这不是我想要的;在没有任何附加值的情况下键入.MyEnum 会令人讨厌且可读性较差。
  • 附加值是,如果你的枚举值都是ThingyAThingyBThingyC,那么你将它们暴露给python作为Thingy.AThingy.BThingy.C。作为一个反对命名空间污染和相关的全球命名空间臭氧洞以及所有这些的令人讨厌的人,我重视这个功能;)
  • 这是一个意见问题(我不同意),无论如何问题要求MyClass.value
  • 您可以通过为每个枚举值添加以下行来获得您想要的行为(假设与上面的代码相同)。这会将具有您想要的值的新符号注入“正确”范围。 the_scope.attr("value1") = MyClass::value1;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 2011-11-06
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
相关资源
最近更新 更多