如何包装运算符<<使用SWIG在Python中__str__?

时间:2017-03-16 17:23:02

标签: python c++ swig

如果我想在C ++中打印有关对象的信息,我将使用outstream运算符<<

class Foo
{
public:
    friend std::ostream& operator<<(std::ostream& out, const Foo& foo);
private:
    double bar = 7;
};

inline std::ostream& operator<<(std::ostream& out, const Foo& foo)
{
    return out << foo.bar;
}

然后,我可以做Foo foo; std::cout << foo << std::endl;。 Python中的等价物将实现__str__,然后说print(foo)。但由于运营商实际上不是Foo的成员,我不知道如何在SWIG中这样做。

我必须在我的界面文件中编写什么才能重用我在print()中使用的outstream运算符的实现?

此外,是否可以让SWIG对对象的shared_ptr进行自动重定向,这样如果我在某处返回std::shared_ptr<Foo>,我仍然可以调用print(sharedPtrToFoo)并且它会调用指向对象的__str__operator<<

1 个答案:

答案 0 :(得分:3)

这样的事情应该有用,假设你没有使用`-builtin':

%extend Foo {
    std::string __str__() const {
         std::ostringstream out;
         out << *$self;
         return out.str();
    }
}

请注意,这与this answer基本相似,但建议使用std::string代替const char *删除微妙的错误。

关于shared_ptrFoo的每个方法都应该以{{1​​}}透明地公开,所以我希望这只是工作。