[Cython] Template functions
Robert Bradshaw
robertwb at gmail.com
Sat Mar 16 18:22:08 CET 2013
On Sat, Mar 16, 2013 at 10:16 AM, John Tyree <johntyree at gmail.com> wrote:
> There is currently a void in Cython's C++ support with respect to function (not
> class) templates. It would be great to have such a thing, dangerous or not, so
> I'm proposing something to get things rolling.
>
> Given that function templates are 100% transparent to the caller, it seems that
> the only barrier is Cython's type system. Even in the easiest case, where the
> function returns a known primitive type for all input, we still can't use it.
>
> template<typename T>
> std::string to_string(T a)
>
> -------
>
> from libcpp.string import string as cpp_string
>
> cdef extern from "foo.h" namespace "std":
>
> cpp_string to_string(??? a, ??? b)
>
>
> We can used fused types if we know that the function is restricted to numeric
> types, for example, but in general this is not the case. The only workaround I
> currently have is to declare the function N times for N types. This isn't
> disastrous, but prevents sharing of code.
>
> As an alternative, what about a dynamic ANY type that uses the fused type
> machinery, but always succeeds when specializing? Or perhaps it just shouldn't
> be type checked at all? There is always a backend that will generate the type
> error and this possibly gives us macro "functions" for free in C.
>
>
> cdef extern from "foo.h" namespace "std":
>
> cpp_string to_string(cython.any_t a, cython.any_t b)
>
>
> Pros:
> Huge number of functions become accessible from Cython
> User explicitly states when a type should be unchecked
> Allows mixtures of typed and untyped parameters in a single call
>
> Cons:
> Makes determining return types hard in some cases.
> Error messages might be difficult to interpret
> ?????
> I'm-sure-this-list-should-be-longer
>
>
> I'll admit I haven't dug very deep as far as the implications of such a thing.
> Is it a reasonable idea? What are the major issues with such an approach?
I was thinking of something along the lines of
cdef extern from ...:
cpp_string to_string[T](T value)
T my_func[T, S](T a, S b)
...
It's more a question of how to implement it.
- Robert
More information about the cython-devel
mailing list