Перечисление в классе - PullRequest
       11

Перечисление в классе

15 голосов
/ 31 августа 2011

У меня есть класс c ++ с перечислением внутри, и я хотел имитировать это с помощью boost::python, чтобы я мог написать MyClass.value на python. boost::python::class_ не имеет enum_ метода, и я искал обходные пути.

  1. Я впервые попробовал с лямбдами типа

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

    , что дает ошибку компилятора (в get_signature для add_property). Я знаю, что мог бы создать метод получения для каждого из значений, но это кажется мне очень неудобным (с точки зрения ввода).

  2. Использование attr:

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

    но он не может быть связан как .def и другие методы, возвращающие ссылку на экземпляр.

Есть ли более элегантное решение?

1 Ответ

13 голосов
/ 04 сентября 2011

Вы можете сделать это, используя область действия:

#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 я проверял это и все;)

...