Can I expose a C++ enum
to SWIG as a real entity rather than a set of constants so I can enumerate over them in python code?
Can I expose a C++ enum
to SWIG as a real entity rather than a set of constants so I can enumerate over them in python code?
I faced the same issue. I hope that SWIG soon supports C++11's enum class
.
Here's a hack that convinces SWIG to put enums in a structure:
#ifdef SWIG
%rename(MyEnum) MyEnumNS;
#endif
struct MyEnumNS
{
enum Value { Value1, Value2, Value3 };
};
typedef MyEnumNS::Value MyEnum;
In .cpp
code you now must use MyEnum::Value1
and in Python code it is MyEnum.Value1
. Although convoluted, the typedef
prevents having to change existing code that uses the enum everywhere and the SWIG %rename makes the enum have the same name in the SWIG wrapper.
In Python you can enumerate the values with a little code:
def values(enum):
return [(k,v) for k,v in vars(enum).items() if isinstance(v,int)]
It's not pretty, and I'd love to see a better solution.