From: Rob S. <rob...@si...> - 2007-04-18 19:31:21
|
We use a macro to define some classes. SWIG doesn't appear to expand the macro -- it can't parse the header, at any rate -- so SWIG doesn't know anything about the generated class. I created a class template which uses CRTP to expose the generated class to SWIG. I used %template to name the specialization of that template back to the original name. (See below.) All of that seems to go well. Unfortunately, SWIG doesn't understand that functions that return the macro-generated type should be turned into instances of the class template specialization. That would suggest typemaps are in order, but I don't know how to tell SWIG to create a proxy object for the template-based type. Here's a simplified form of the interface file: %{ #include "Example.h" #include "wrapper.h" %} %include "wrapper.h" %template(Example) wrapper<Example>; %pythoncode %{ Example_FOO = Example_fromString('FOO') Example_BAR = Example_fromString('BAR') %} Here's a simplified version of wrapper.h: template <class T> struct wrapper : T { wrapper(T const & that_i); wrapper(typename T::value const value_i); ~wrapper(); typename T::value getValue() const; std::string toString() const; wrapper operator |(wrapper const & rhs_i) const; static wrapper fromString(std::string const & name_i); }; What I need is a typemap(out) for real Example instances (not the renamed ones from the %template directive), so that when a function returns an Example, SWIG will create a proxy of a wrapper<Example> instead. I would hate to have to %ignore/%extend all functions that return an Example. I don't think I will need a typemap(in) to handle the case in which a function expects an Example because a wrapper<Example> can be assigned to an Example. -- Rob Stewart rob...@si... Software Engineer http://www.sig.com Susquehanna International Group, LLP using std::disclaimer; |