Schnittstelle zwischen C++11-Array und Cython

Lesezeit: 2 Minuten

Benutzer-Avatar
Jean Baptiste F.

Ich bin es gewohnt, C++-Programme zu erstellen und es in Cython zu bekommen, aber hier versuche ich, C++ 11 zu bekommen array und es geht definitiv nicht.

Hier ist meine .pxd:

cdef extern from "<array>" namespace "std" nogil :
    cdef cppclass array[T, size_t]:
        ctypedef T value_type
        cppclass iterator:
            T& operator*()
            iterator operator++()
            iterator operator--()
            iterator operator+(size_t)
            iterator operator-(size_t)
        bint operator==(iterator)
        bint operator!=(iterator)
        bint operator<(iterator)
        bint operator>(iterator)
        bint operator<=(iterator)
        bint operator>=(iterator)
        T& operator[](size_t)
        array() except +
        array(array&) except +

Der größte Teil dieser Datei ist eine Adaption von “vector.pxd”, aber ich habe den Allocator entfernt, weil c++11 array braucht es nicht. ich benutzte size_t als zweites Vorlagenargument, aber ich bin mir nicht sicher.

Das Problem ist, wenn ich tue:

    from array11 cimport array
    cdef array[int, 5] test   

Ich bekomme beim Kompilieren:

unbekannter Typ im Template-Argument

Wenn ich mache :

    from array11 cimport array
    cdef array[int, 5] * test = new array[int, 5]()

Ich bekomme :

new-Operator kann nur auf eine C++-Klasse angewendet werden

Irgendeine Idee, was ich falsch mache?

Vielen Dank!

  • Unterstützt Cython Nicht-Typ-Vorlagen?

    – AndyG

    16. Dezember 2016 um 20:29 Uhr

  • Es könnte die richtige Frage sein!

    – Jean-Baptiste F.

    16. Dezember 2016 um 20:45 Uhr

  • @AndyG Nein, es werden keine Nicht-Typ-Vorlagen unterstützt

    – DavidW

    17. Dezember 2016 um 8:52 Uhr

  • Andere Leute haben sich jedoch etwas zufriedenstellende Problemumgehungen ausgedacht. Werfen Sie einen Blick auf das Wesentliche von stackoverflow.com/questions/36357024/…

    – DavidW

    17. Dezember 2016 um 8:57 Uhr

  • Es gibt also keine Möglichkeit, std::array ohne feste Größe in der .pxd zu implementieren?

    – Jean-Baptiste F.

    17. Dezember 2016 um 9:12 Uhr

Benutzer-Avatar
DavidW

Wie in den Kommentaren besprochen, besteht das Problem darin, dass Cython keine Nicht-Typ-Vorlagenargumente unterstützt. Eine Problemumgehung (hacky und wahrscheinlich zerbrechlich) besteht darin, Cython dazu zu bringen, zu glauben, dass es ein Typvorlagenargument bereitstellt:

cdef extern from "<array>" namespace "std" nogil :
    cdef cppclass two "2":
        pass

    cdef cppclass array[T, U]:
        T& operator[](size_t)
        # this is obviously very very cut down

def f():
    cdef array[int,two] x
    return x[0]+x[1]

Der Trick ist, dass, wenn Sie es tun cdef cppclass name "somestring" Cython wird einfach blind ersetzen somestring for name, wodurch der korrekte C++-Code generiert wird. Es gibt offensichtlich einige Einschränkungen bei diesem Ansatz, aber für eine einfache Verwendung sollte es in Ordnung sein.

  • Wow. Es mag zerbrechlich sein, es kann hacky sein, aber es ist WIRKLICH kreativ.

    – Jean-Baptiste F.

    17. Dezember 2016 um 15:38 Uhr

1012460cookie-checkSchnittstelle zwischen C++11-Array und Cython

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy