【问题标题】:operator= in Cython cppclass运算符 = 在 Cython cppclass 中
【发布时间】:2019-02-05 22:16:08
【问题描述】:

如何告诉 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 要么抱怨“分配给引用状态”,要么(如果我将状态设为非引用)从字符串“FOO”构造一个 python 对象,然后尝试将这个 python 对象分配给状态。

【问题讨论】:

    标签: cython cythonize


    【解决方案1】:

    您的代码中的问题是,对于 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"
    

    我不完全确定引用分配的问题不是错误。

    另一个观察:赋值运算符不是标准容器“官方”包装的一部分,请参阅herehere

    【讨论】:

      猜你喜欢
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 2016-06-09
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多