Boost.Python教程:类操作符/特殊功能

版权声明:本文为博主原创文章,欢迎转载(请声明出处),私信通知即可 https://blog.csdn.net/xinqingwuji/article/details/89227194

Python运算符
C以丰富的操作符而闻名。 C ++通过允许运算符重载将其扩展到极限。 Boost.Python利用了这一点,并且可以很容易地包装C ++运算符驱动的类。
考虑文件位置类FilePos和一组采用FilePos实例的运算符:

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__


上面的代码片段非常清晰,几乎不需要任何解释。它几乎与运营商的签名相同。请注意,self指的是FilePos对象。也,
并非您在运算符表达式中可能需要与之交互的每个类都是(廉价地)默认可构造的。在编写“自我表达式”时,可以使用其他<T>()代替实际的T实例。

特殊方法
Python还有一些特殊方法。促进。
Python支持真正的Python类实例支持的所有标准特殊方法名称。一组类似的直观接口也可用于包装与这些Python特殊函数相对应的C ++函数。例:

class Rational
{ public: operator double() const; };

Rational pow(Rational, Rational);
Rational abs(Rational);
ostream& operator<<(ostream&,Rational);

class_<Rational>("Rational")
    .def(float_(self))                  // __float__
    .def(pow(self, other<Rational>))    // __pow__
    .def(abs(self))                     // __abs__
    .def(str(self))                     // __str__
    ;


 

猜你喜欢

转载自blog.csdn.net/xinqingwuji/article/details/89227194