[C++-sig] Exposing a generic template system in Boost.Python
Greetings, I have been trying to think of a solution about this for a few days now, but I did not get very far. I am exposing specific instances of C++ template classes using Boost.Python. Let's say for the sake of argument that I am exposing std::vector. What I would like to achieve on the Python side would be some kind of unified interface of this kind: # Define a vector-of-ints type. vec_int = vector["int"] # Define a vector-of-doubles type. vec_float = vector["double"] ... etc., possibly with exceptions being raised if a template type which has not been exposed is requested. Additionally, the system should automagically work with nested generic types: # Define a vector-of-vectors-of-ints type. vec_vec_int = vector[vector["int"]] I have played around with some ideas, but it seems like I can never get to a point where the design does not look bloated and/or brittle. Thus I am wondering, is there anyone that tackled a problem like this before in Boost.Python and has pointers/suggestions on how to do this properly? Support for things like default template arguments would definitely be a plus. FWIW, I have access to C++11 on the C++ side, so I can deal with variadic templates and other amenities in a not-so-kludgy way. Thanks for any input, Francesco. ___ Cplusplus-sig mailing list Cplusplus-sig@python.org https://mail.python.org/mailman/listinfo/cplusplus-sig
Re: [C++-sig] Exposing a generic template system in Boost.Python
Francesco, I have done something like what you are suggesting. It essentially boils down to defining a function template like template void define_vector(char const *name) { class_<...> vector(name); ... } and then calling that multiple times: define_vector("IVector"); define_vector("LVector"); ... Providing a factory function that instantiates one of those based on a value-type selector as you want can be easily done on the Python side. I don't think this can be automated any further. In particular, it is clear that any type you may want to instantiate in Python has to be compiled explicitly into the extension module. I.e., you need to explicitly instantiate the templates above, by explicitly calling the functions for the types you want to see supported at runtime. There is no JIT compilation for this. Stefan -- ...ich hab' noch einen Koffer in Berlin... ___ Cplusplus-sig mailing list Cplusplus-sig@python.org https://mail.python.org/mailman/listinfo/cplusplus-sig
Re: [C++-sig] Exposing a generic template system in Boost.Python
To add to Stefan's answer: I do the the same and also use visitors to add the same sets of members to classes, with possible customizations via trait classes. HTH On Wed, Mar 19, 2014 at 1:36 PM, Stefan Seefeld wrote: > Francesco, > > I have done something like what you are suggesting. It essentially boils > down to defining a function template like > > template > void define_vector(char const *name) > { >class_<...> vector(name); > ... > } > > > and then calling that multiple times: > > define_vector("IVector"); > define_vector("LVector"); > ... > > Providing a factory function that instantiates one of those based on a > value-type selector as you want can be easily done on the Python side. > > I don't think this can be automated any further. In particular, it is > clear that any type you may want to instantiate in Python has to be > compiled explicitly into the extension module. I.e., you need to > explicitly instantiate the templates above, by explicitly calling the > functions for the types you want to see supported at runtime. There is > no JIT compilation for this. > > Stefan > > -- > > ...ich hab' noch einen Koffer in Berlin... > > ___ > Cplusplus-sig mailing list > Cplusplus-sig@python.org > https://mail.python.org/mailman/listinfo/cplusplus-sig > ___ Cplusplus-sig mailing list Cplusplus-sig@python.org https://mail.python.org/mailman/listinfo/cplusplus-sig