[PyQt] Wrapping a scoped template type
Phil Thompson
phil at riverbankcomputing.com
Sun Mar 21 10:38:44 GMT 2010
On Sun, 21 Mar 2010 11:09:19 +0100, Philip Lorenz <lorenzph+sip at in.tum.de>
wrote:
> Hi,
>
> I am trying to wrap a templated scoped type (in my case
> std::set<T>::iterator) using SIP 4.10.0. However I have not yet managed
> to find a solution which solves this case nicely.
>
> According to the SIP reference templates must be of the form template
> ::= scoped-name < type-list > which does not fit here.
>
> I have tried to wrap the std::set<T> declaration using a typedef, i.e.:
>
> typedef std::set<T> myset
> typedef myset::iterator mysetiterator
>
> but this resulted in a myset is undefined error message.
>
> Hence my current approach is to typedef the iterator to a void * for SIP
> and mapping it to the real type inside a %ModuleHeaderCode:
>
> %ModuleHeaderCode
> typedef std::set<MyType>::iterator MyTypeSetIterator;
> %End
>
> typedef void * MyTypeSetIterator;
>
>
> Unfortunately this requires a patched SIP binary as the generated source
> files refer to the type by void * (I am not using the /NoTypeName/
> annotation) rather than the name specified by the typedef.
>
> I have attached the patch file against SIP which works around the issue
> described above. However I would be very grateful if anyone knows how to
> solve this issue in a nicer way.
Do you want to define a template to SIP, or are you only interested in the
<MyType> version?
If the latter then...
%ModuleHeaderCode
typedef std::set<MyType>::iterator MyTypeSetIterator;
%End
%MappedType MyTypeSetIterator
...
%End
If the former then the following might work...
%ModuleHeaderCode
typedef std::set<T>::iterator std::set_iterator<T>
%End
template<T>
%MappedType std::set_iterator<T>
...
%End
Phil
More information about the PyQt
mailing list