оператор = в Cython cppclass - PullRequest
       9

оператор = в Cython cppclass

0 голосов
/ 06 февраля 2019

Как я могу сказать Cython, что мой класс C ++ перегружен operator=?Я попытался:

cdef extern from "my_source.H":
  cdef cppclass MyStatus:
    void operator=(const char* status)

cdef public void setStatus(MyStatus& status):
  status = "FOO"

, но Cython либо жалуется на «Присвоение ссылочного статуса», либо (если я делаю статус не ссылочным) создает объект python из строки «FOO», а затем пытается назначитьобъект Python в статус.

1 Ответ

0 голосов
/ 06 февраля 2019

Проблема в вашем коде в том, что для Cython "FOO" является Python-объектом.Для выражений типа

char *s = "FOO"

Cython достаточно умен, чтобы понять, что вы хотите, и автоматически интерпретирует "FOO" как char *.

Однако, Cython на самом деле не "понимает" /интерпретировать подписи обернутых c ++ - функций (для этого это должен быть c ++ - компилятор) и поэтому не может знать, что вы хотите, чтобы "FOO" был char *.

Таким образом, вы должны помочь Cython, дляпример:

status = <const char *>"FOO"

Вам также нужно обойти проблему со ссылкой, например, с помощью:

cdef public void setStatus(MyStatus *status):
    status[0] = <const char *>"FOO"

или если вы хотите сохранить сигнатуру функции без изменений:

cdef public void setStatus(MyStatus& status):
     cdef MyStatus * as_ptr = &status 
     as_ptr[0] = <const char *>"FOO"

Я не совсем уверен, что проблема с назначением ссылки не является ошибкой.

Еще одно наблюдение: операторы назначения не являются частью "официального" переносастандартные контейнеры, см. здесь или здесь .

...