2016-05-28 4 views
1

Was ist der korrekte zythoische Weg, um die folgenden Elementfunktionen eines boost::geometry::Point zu wickeln? Das Code-Snippet kommt von here.Cythonic Weg, um zu wickeln Boost :: Geometrie :: Punkt Zugriffsmethoden

/// @brief Get a coordinate 
    /// @tparam K coordinate to get 
    /// @return the coordinate 
    template <std::size_t K> 
    inline CoordinateType const& get() const 
    { 
#if defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) 
     BOOST_GEOMETRY_ASSERT(m_created == 1); 
     BOOST_GEOMETRY_ASSERT(m_values_initialized[K] == 1); 
#endif 
     BOOST_STATIC_ASSERT(K < DimensionCount); 
     return m_values[K]; 
    } 

    /// @brief Set a coordinate 
    /// @tparam K coordinate to set 
    /// @param value value to set 
    template <std::size_t K> 
    inline void set(CoordinateType const& value) 
    { 
#if defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) 
     BOOST_GEOMETRY_ASSERT(m_created == 1); 
     m_values_initialized[K] = 1; 
#endif 
     BOOST_STATIC_ASSERT(K < DimensionCount); 
     m_values[K] = value; 
    } 

Ich versuchte zuerst mit:

cdef extern from "s57/data/geometries.h" namespace "bg::model": 
    cdef cppclass _Geo2 "bg::model::point<double, 2, bg::cs::spherical_equatorial<bg::degree>>": 
     _Geo2() 
     _Geo2(const _Geo2& other) 
     const double get[size_t]() except + 
     void set[size_t](double) except + 

aber dann weiß ich nicht, wo, wie dies seit etwas gehen:

property x: 
    def __set__(self, double value): 
     deref(self._p).set[0](value) 

gibt mir diesen Fehler:

Error compiling Cython file: 
------------------------------------------------------------ 
... 
    property x: 
     def __set__(self, double value): 
      deref(self._p).set[0](value) 
          ^
------------------------------------------------------------ 

c:\XXXX\x.pyx:24:31: not parsable as a type 

Meine aktuelle Arbeit so lution wurde wie einige Hilfsfunktionen zu erstellen:

double get_geo2_x(geo2& pnt); 
double get_geo2_y(geo2& pnt); 
void set_geo2_x(geo2& pnt, double value); 
void set_geo2_y(geo2& pnt, double value); 

Hat jemand daran eine elegantere Lösung?

Antwort

3

Probleme mit Cythons Umgang mit nicht typisierten Vorlagenparametern treten auf. Sie können manuell Funktionsnamen mit Strings angeben, die direkt in den generierten C-Code eingefügt werden (siehe http://docs.cython.org/src/userguide/external_C_code.html#resolving-naming-conflicts-c-name-specifications)

Als einfaches Beispiel

// example.hpp 
#include <iostream> 

class C { 
    template <int K> 
    void set(double value) { 
     std::cout << K << ": " << value << std::endl; 
    } 

Und der Cython Code

cdef extern from "example.hpp": 
    cdef cppclass C: 
     void set0 "set<0>"(double) except + 
     void set1 "set<1>"(double) except + 


def do_set(): 
    # very simple illustrative example 
    cdef C c 
    c.set0(1.0) 
    c.set1(1.5) 
} 

Wann immer Cython sieht set0 aufgerufen auf C ersetzt set<0>, die Vorlage Funktion direkt aufrufen. Sie können dann Eigenschaften verwenden, wie Sie es versuchten.

Dies ist wahrscheinlich nicht wesentlich besser als das Erstellen von Hilfsfunktionen, aber es könnte ein wenig einfacher sein.

Verwandte Themen