2010-12-18 64 views
3

我一直在使用PerlXS來編寫圍繞C++對象的perl包裝器。通常我的fcn需要一個字符串/ int等,我可以讓他們沒有問題。我只是在.xs文件中寫這樣的代碼如何使用PERL XS調用STL中的C++函數向量

MyClass::func_a(std::string a, int b); 

這次;我有一個需要有一個函數,它在STL的vector

MyClass::func_a(std::vector<std::string> vector) 

我得到這個錯誤:

conversion from `SV*' to non-scalar type 
    `std::vector<std::string, std::allocator<std::string> >' 

回答

4

您不能直接調用本地函數,它接受一個STL容器。您應該編寫一個包裝並手動將SV *轉換爲STL容器。

如果你不知道如何做到這一點(像我),嘗試使用痛飲http://www.swig.org/

它可以產生包裝的原生功能可按從腳本語言(包括Perl和XS-發電機使用)。 SWIG的代碼不是很漂亮,也有一些限制,但它是編寫包裝的簡單方法。

SWIG具有STL內置有限支持:http://www.swig.org/Doc1.3/Library.html#Library_stl_cpp_library

此外,對於使用PerlXS和載體,檢查此螺紋http://www.mail-archive.com/[email protected]/msg00623.html

1
+0

tsee,並XS ++自動與複雜的STL結構的工作,像串 – osgx 2010-12-19 16:51:56

+0

號的矢量但有可用的一些可重複使用的typemaps在CPAN上。請參閱ExtUtils :: Typemap和ExtUtils :: Typemap :: STL及其同級。具體來說,支持字符串的向量。它沒有做的是自動遞歸映射。即「我知道媒介如何工作以及字符串是如何工作的,這意味着我也知道字符串媒介向量的運作方式。」 – tsee 2010-12-19 22:20:22