Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
517 views
in Technique[技术] by (71.8m points)

c++ - How to enumerate enum members using SWIG

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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...