On 10/05/2011 09:26 AM, Stefan Seefeld wrote:
On 10/05/2011 09:18 AM, Jim Bosch wrote:
I have one (perhaps unusual) use case that's extremely important for me: I have a templated matrix/vector/array class, and I want to define converters between those types and numpy that work with any combination of template parameters. I can do that with compile-time converters, and after including the header everything just works. With runtime conversions, I have to explicitly declare all the template parameter combinations I intend to use.
Jim,
I may be a little slow here, but I still don't see the issue. You need to export your classes to Python one at a time anyhow, i.e. not as a template, letting the Python runtime figure out all valid template argument permutations. So why can't the converter definitions simply be bound to those type definitions ?
The key point is that I'm not exporting these with "class_"; I define converters that go directly to and from numpy.ndarray. So if I define template-based converters for my class ("ndarray::Array<T,N,C>"), a function that takes one as an argument: void fillArray(ndarray::Array<double,2,1> array); ...can be wrapped to take a numpy.ndarray as an argument, just by doing: #include "array-from-python.hpp" ... bp::def("fillArray", &fillArray); Without template converters, I also have to add something like: register_array_from_python< ndarray::Array<double,2,1> >(); (where register_array_from_python is some custom runtime converter I'd have written) and repeat that for every instantiation of ndarray::Array I use. This involves looking through all my code, finding all the combinations of template parameters I use, and registering each one exactly once across all modules. That would get better with some sort of multi-module registry support, but I don't think I should have to declare the converters for each set of template parameters at all; it's better just to write a single compile-time converter. Jim