Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Cython:用户如何定义C++-类可以使用吗?_Python_C++_Cython - Fatal编程技术网

Python Cython:用户如何定义C++-类可以使用吗?

Python Cython:用户如何定义C++-类可以使用吗?,python,c++,cython,Python,C++,Cython,赛顿似乎对如何包装保持沉默 例如,当以下c++代码打印1(即true)时: #包括 结构X{ 运算符bool()常量{return true;} }; int main(){ X; std::cout仅查看bool案例: 我不认为print(x)无论如何都应该将其转换为bool。print(x)寻找到Python对象的转换(好的,bool可以转换为Python对象,但这有点间接)只有在相当有限的情况下,比如在if语句中,Cython通常遵循Python行为作为规则 def testit():

赛顿似乎对如何包装保持沉默

例如,当以下c++代码打印
1
(即
true
)时:

#包括
结构X{
运算符bool()常量{return true;}
};
int main(){
X;

std::cout仅查看
bool
案例:

  • 我不认为
    print(x)
    无论如何都应该将其转换为bool。
    print(x)
    寻找到Python对象的转换(好的,
    bool
    可以转换为Python对象,但这有点间接)只有在相当有限的情况下,比如在
    if
    语句中,Cython通常遵循Python行为作为规则

    def testit():
        cdef X x
        if x:
            print("is True")
        else:
            print("if False")
    
  • 运算符bool()
    给出错误

    “运算符”不是类型标识符

    我假设它需要返回的类型,就像每个其他C++函数一样(即,对于<代码>操作符< /代码>没有特殊的情况)。这是工作的(排序…参见下一点…):

    这就是语法

  • >P>但是,您需要从文件顶部的LIbCPP C导入Boo./COD>执行<代码>,以获得C++ <代码> BOOL 类型。

    如果您查看转换后的源代码,如果x:
    ,它将作为

    __pyx_t_1 = __pyx_v_x.operator bool();
    if (__pyx_t_1) {
    
    操作符bool
    被显式调用(这对于Cython来说非常常见),但使用的位置正确,因此Cython清楚地了解它的用途。类似地,如果在不定义操作符的情况下执行
    if x:
    ,则会出现错误

    类型为“X”的对象没有属性“运算符bool”

    再次说明,这是Cython的一个特点

    <> P.>这里显然有一点文档失败,如果语法在未来更接近C++,我不会感到惊讶。

    对于更一般的情况:目前,您无法定义其他运算符。

    仅查看
    bool
    情况:

  • 我不认为
    print(x)
    无论如何都应该将其转换为bool。
    print(x)
    寻找到Python对象的转换(好的,
    bool
    可以转换为Python对象,但这有点间接)只有在相当有限的情况下,比如在
    if
    语句中,Cython通常遵循Python行为作为规则

    def testit():
        cdef X x
        if x:
            print("is True")
        else:
            print("if False")
    
  • 运算符bool()
    给出错误

    “运算符”不是类型标识符

    我假设它需要返回的类型,就像每个其他C++函数一样(即,对于<代码>操作符< /代码>没有特殊的情况)。这是工作的(排序…参见下一点…):

    这就是语法

  • >P>但是,您需要从文件顶部的LIbCPP C导入Boo./COD>执行<代码>,以获得C++ <代码> BOOL 类型。

    如果您查看转换后的源代码,如果x:,它将作为

    __pyx_t_1 = __pyx_v_x.operator bool();
    if (__pyx_t_1) {
    
    操作符bool
    被显式调用(这对于Cython来说非常常见),但使用的位置正确,因此Cython清楚地了解它的用途。类似地,如果在不定义操作符的情况下执行
    if x:
    ,则会出现错误

    类型为“X”的对象没有属性“运算符bool”

    再次说明,这是Cython的一个特点

    <> P.>这里显然有一点文档失败,如果语法在未来更接近C++,我不会感到惊讶。

    对于更一般的情况:目前,您无法定义其他运算符。

    这只是对的一些补充

    如前所述,Cython只支持
    运算符bool
    ——其他用户定义的转换,如:

    cdef CPPX类:
    int运算符int()
    
    将导致错误消息,如

    尚不支持重载运算符“int”

    一种可能的解决方法不是包装用户定义的转换,而是在需要时使用显式转换。例如:

    %%cython-+-a
    cdef外部源*:
    """
    结构X{
    //隐式转换
    运算符int()常量{return 42;}
    };
    """
    cdef CPPx类:
    传递#离开运算符int()
    def testit():
    cdefx;
    打印(x)
    
    它编译并打印
    42
    一次
    testit
    被调用。Cython在这里不干预显式强制转换

    具有讽刺意味的是,上述解决方法不适用于
    操作符bool()

    %%cython-+-a
    cdef外部源*:
    """
    结构X{
    //隐式转换
    运算符bool()常量{return true;}
    };
    """
    cdef CPPx类:
    忽略运算符bool()
    def testit():
    cdefx;
    如果x:
    打印(真)
    其他:
    打印(假)
    
    导致错误消息:

    类型为“X”的对象没有属性“运算符bool”

    显然,此检查是
    运算符bool()
    -支持包的一部分

    但是,可以使用cast to
    int
    而不是cast to
    bool/bint
    来实现以下目标:

    。。。
    如果x:
    ...
    
    但是,应优先使用
    运算符bool()


    简言之:

  • 使用
    bint操作符bool()
    包装C++的
    操作符bool()
  • 不要对其他运算符换行并使用显式强制转换

  • 这只是一些补充

    如前所述,Cython只支持
    运算符bool
    ——其他用户定义的转换,如:

    cdef CPPX类:
    int运算符int()
    
    将导致错误消息,如

    尚不支持重载运算符“int”

    阿宝