使用Boost Python,我可以包装C++重载操作符“+=”、“=”、“*=”,而不是“/=”?

2024-09-27 22:19:48 发布

您现在位置:Python中文网/ 问答频道 /正文

boostpython有一种包装重载运算符的非常简单的方法。在BooSt.Org(^ {A1})中公开C++类、方法等的教程给出了这个例子:

一个示例类的重载C++运算符,FILPOPRS:

class FilePos { /*...*/ };

FilePos     operator+(FilePos, int);
FilePos     operator+(int, FilePos);
int         operator-(FilePos, FilePos);
FilePos     operator-(FilePos, int);
FilePos&    operator+=(FilePos&, int);
FilePos&    operator-=(FilePos&, int);
bool        operator<(FilePos, FilePos);

如何将它们映射到Python:

class_<FilePos>("FilePos")
    .def(self + int())          // __add__
    .def(int() + self)          // __radd__
    .def(self - self)           // __sub__
    .def(self - int())          // __sub__
    .def(self += int())         // __iadd__
    .def(self -= other<int>())
    .def(self < self);          // __lt__

我有一个C++类,叫做“角度”,它代表一个角度。它具有重载运算符,包括“+=”、“-=”、“*=”和“/”。每个重载运算符设计用于将某些类型为double的输入与Angle类持有的度数值相加、相减、相乘或相除。Angle类包装器以与上面示例中描述的完全相同的方式映射这些重载运算符。当我在Python中测试加法、减法和乘法运算符时,它们工作得非常好。除法运算符,不是这样。当我运行这样一个简单的测试时:

A = Angle(1) # instantiate Angle object with magnitude of 1 radian
A /= 2.0 # attempt to divide the radian measurement by 2

我得到以下错误:

TypeError: unsupported operand type(s) for /=: 'Angle' and 'float'

基于这个问题:

Error when trying to overload an operator "/"

我看到Python3(我正在使用的版本)有一种理解“/”字符的独特方式。但是,这个解决方案对我来说不适用,因为我使用的类是一个包的C++类。p> 我的问题是:有没有一种方法可以使用Boost来将重载操作符“/=”映射到C++中,从而保留相同的语法(即,不编写C++中的一个瘦包,称为“SelfDIV”,执行相同的操作,但必须用“角度.SelfDeVE())调用)?也许有某种方法可以覆盖Python如何解释正斜杠字符


Tags: to方法self示例def方式运算符字符
1条回答
网友
1楼 · 发布于 2024-09-27 22:19:48

Python3改变了除法操作符的定义方式,Boost.Python的自动生成版本使用旧的Python2样式进行就地除法,这种方式不再有效。这似乎是一个疏忽,因为非就地版本已经更新为Python3的__truediv__魔术方法。这件事本身就有一个问题。在修复之前,您可以像定义任何其他类成员函数一样定义__itruediv__和/或__ifloordiv__

class_<Foo>("Foo")
    .def(
        "__itruediv__",
        &Foo::operator/=,
        return_self<>{}
    );

相关问题 更多 >

    热门问题