Обертывание шаблонной функции / метода C ++ в Cython - PullRequest
7 голосов
/ 03 января 2012

Я пытаюсь обернуть немного кода C ++ с помощью Cython. У меня есть класс, который использует метод шаблона, но не сам шаблон.

class SomeClass {
    template <class T> SomeClass(T& spam);
};

Поскольку класс является не шаблоном, а только конструктором, я не могу объявить класс как шаблон в Cython следующим образом.

# wrong!
cdef extern from "SomeClass.h":
    cppclass SomeClass [T]:
        SomeClass(T& spam)

Как мне обернуть шаблон-метод?

Ответы [ 3 ]

0 голосов
/ 04 июля 2013

Как насчет Boost-оболочки для Cython?

http://www.boost.org/doc/libs/1_54_0/libs/python/doc/index.html

Добро пожаловать в версию 2 Boost.Python, библиотеки C ++, которая обеспечивает бесшовную совместимость между C ++ и языком программирования Python.Новая версия была переписана с нуля, с более удобным и гибким интерфейсом и множеством новых возможностей, включая поддержку: ссылок и указателей Приводы глобально зарегистрированных типов Автоматические преобразования кросс-модульных типов Эффективная перегрузка функций С ++ в Python Исключение перевода По умолчаниюАргументы Ключевое слово Аргументы Манипулирование объектами Python в C ++ Экспорт итераторов C ++ в виде итераторов Python Строки документации

Полагаю, вы ищете что-то подобное, это уже есть в составе библиотеки boost c ++

0 голосов
/ 19 июня 2015

Для не шаблонного метода-шаблона используется следующий не-шаблонный класс:

class SomeClass {
    template <class T> void other(T& spam);
};

Я смог заставить это работать:

cdef extern from "someclass.h":
    cppclass SomeClass:
        void other[T](T &spam)

Это может не помочь вам, если вам конкретно нужен метод шаблона конструктора, но, похоже, поддержка Cython для методов шаблона улучшилась хотя бы незначительно со времени, когда этот вопрос был задан изначально.

0 голосов
/ 01 июля 2013

Легко.(Или я так думаю). В классе C ++ член является шаблонным, тогда как в Cython вы объявляете этот класс шаблонным.Измените код на:

template <class T>
class SomeClass {
    SomeClass(T& spam);
};

Если это возможно, или на:

cdef extern from "SomeClass.h":
    cppclass SomeClass:
        SomeClass [T](T& spam)

Если Cython поддерживает это.

Я не эксперт по Cython, поэтомуЯ могу ошибаться.

...