2015-06-29 6 views
11

Задача

У меня есть класс шаблонов в C++, который имеет статический метод. Это выглядит более или менее, как это:Статические методы Cython C++ в классе шаблонов

template<typename T> 
class Foo { 
    static std::shared_ptr<Foo<T>> doSth(); 
} 

так в C++ вы могли бы назвать это нравится: Foo<Int>::doSth();. В Cython однако, способ вызова статических методов является использование имени класса в качестве пространства имен:

cdef extern from "Bar.h" namespace "Bar": 
    shared_ptr[Bar] doSth() # assuming shared_ptr is already declared 

, но это не имеет никакого понятия шаблонов. Очевидно, просто проходя Foo<T> как пространство имен не работает, потому что это приводит к Foo<T>::doStr() в C++, не конкретный тип не подменяется Т.

Вопрос

Как бы вы сделать это в Cython? Есть ли способ или обходной путь?

+0

Не должны ли эта работа, как объяснено для нестатических методов в документации? http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html#templates –

+0

К сожалению, это не так. Написание 'cdef extern из пространства имен Foo.h« Foo »: shared_ptr [Foo [T]] doSth [T]()' тоже не работает. Это потому, что cython генерирует код на C++, например: 'Foo :: doSth ();' - параметр шаблона после Foo отсутствует. – piotrMocz

ответ

3

Примечание: Этот ответ был прав в то время, когда он был написан (и все еще работает), но вы должны теперь использовать @Robertwb's answer to this question instead, чтобы сделать это правильно.


Я не думаю, что вы можете сделать это прямо в Китоне. Можно создать очень тонкую оболочку нормального (нестатического-метод) с ++ шаблон функция

template <typename T> 
std::shared_ptr<Foo<T>> Foo_T_doSth<T>() { 
    return Foo<T>::doSth(); 
} 

и затем обернуть этот метод в Cython

cdef extern from "..." 
    shared_ptr[T] Foo_T_doSth[T]() 

Как в стороне, рекомендуемый способ оберточной статических методов Cython выглядит (от https://groups.google.com/forum/#!topic/cython-users/xaErUq2yY0s)

cdef extern from "...": 
    cdef Foo_doSth "Foo::doSth"() # not declared as a memeber 

(указав тыс фактическая функция для использования в качестве строки). Это не поможет вам, потому что оно не справляется с шаблонами. Возможно, это я неправильно информировал вас о том, как вы пытались ...

+0

Обертка это отлично работает для меня, спасибо еще раз. Я просто надеялся, что смогу избежать возиться с моим кодом на C++, но это все еще супер круто. Я перейду к рекомендованному пути :) – piotrMocz

5

Статические методы теперь напрямую поддерживаются Cython; перехват пространства имен больше не нужен или не рекомендуется.

cdef extern from "Foo.h": 
    cdef cppclass Foo[T]: 
     @staticmethod 
     shared_ptr[Foo[T]] doSth() # assuming shared_ptr is already declared 

cdef shared_ptr[Foo[int]] shared_ptr_value = Foo[int].doSth() 

http://docs.cython.org/en/latest/src/userguide/wrapping_CPlusPlus.html#static-member-method

Смежные вопросы