Cython:如何使用 C++ 类的用户定义转换?

2024-04-27

赛通的文档 https://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html#overloading-operators似乎对如何用户定义的转换 https://en.cppreference.com/w/cpp/language/cast_operator可以包裹。

例如,虽然以下 C++ 代码打印1 (i.e. true, 住在这里 https://ideone.com/FC9YW1):

#include <iostream>

struct X{
    operator bool() const{ return true;}    
};

int main() {
    X x;
    std::cout << x << "\n";
}

它在 Cython 中的“等效项”:

%%cython  -+
cdef extern from *:
    """
    struct X {
        //implicit conversion
        operator bool() const { return true; }
    };
    """
    cdef cppclass X:
        operator bool()  # ERROR HERE

def testit():
    cdef X x;
    print(x) # implicit cast, "should" print True

没有被 cythonized 并显示以下错误消息(在标记为ERROR HERE):

“operator”不是类型标识符

如何从 Cython 使用用户定义的转换?如果不能,解决方法是什么?


只看bool case:

  1. 我不相信print(x)无论如何应该将其转换为 bool 。print(x)寻找到 Python 对象的转换(好吧,bool可以转换为Python对象,但有点间接)。 Python 本身使用__bool__ (__nonzero__在Python 2)仅在相当有限的情况下,例如在if声明,Cython 通常遵循 Python 行为作为规则。因此我将测试代码更改为

    def testit():
        cdef X x
        if x:
            print("is True")
        else:
            print("if False")
    
  2. operator bool()给出错误

    “operator”不是类型标识符

    我认为它需要像其他 C++ 函数一样从返回类型开始(即没有特殊情况operator)。这有效(有点......参见下一点......):

    bool operator bool()
    

    这是一个语法在 Cython 的测试套件中进行了测试 https://github.com/cython/cython/blob/aaad38f78580193892ff4b4883bb28d5793c6b9e/tests/run/cpp_operators.pyx#L142.

  3. 但是,您确实需要这样做from libcpp cimport bool在文件顶部获取 C++bool type.

如果您查看转换后的源if x:它最终是

__pyx_t_1 = __pyx_v_x.operator bool();
if (__pyx_t_1) {

operator bool被显式调用(这对于 Cython 来说很常见),但在正确的位置使用,因此 Cython 清楚地理解它的用途。同样,如果你这样做if x:如果没有定义运算符,您会收到错误

类型“X”的对象没有属性“operator bool”

再次表明这是 Cython 的一个功能。

这里显然存在一些文档错误,如果将来语法发生变化以更接近 C++,我可能不会 100% 感到惊讶。


对于更一般的情况:看起来像bool是唯一受支持的类型转换运算符 https://github.com/cython/cython/blob/5a8c984403ce73ac29f9e8b7c78ee5f0f4c608a3/Cython/Compiler/Parsing.py#L2834目前,因此您无法定义其他运算符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cython:如何使用 C++ 类的用户定义转换? 的相关文章

随机推荐