2017-03-16 59 views
0

如果我想打印約在C++對象的信息,我將使用outstream運營商<<如何使用SWIG在Python中將運算符<<包裝爲__str__?

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<<反對?

+0

這似乎是相關的:http://stackoverflow.com/questions/25199233/str-not-called-when-printing-c-class-wrapped-for-python-with-swig – user2357112

回答

1

像這樣的東西應該工作,假設你沒有使用`-builtin':

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

注意,這是基本相似的this answer,儘管推薦使用std::string代替const char *移除一個微妙的錯誤。

關於shared_ptr應該是,Foo的每種方法都透明地使用shared_ptr<Foo>,所以我期望能夠正常工作。

+0

工程就像一個魅力。謝謝。 – Psirus