2011-01-04 15 views
0

私は私のソフトウェア・ライブラリ用のPython用のSWIGを使用してラッパーを作成していると私は、次の機能があります。この場合SWIG:戻り値として関数テンプレートと共有ポインタでのpythonコールバック

template<class PR> 
    boost::shared_ptr<JobT<PR> > Client::WaitForJob() { 
     boost::shared_ptr<JobT<PR> > job; 
     while (!job.get()) { 
      list<boost::shared_ptr<Job> > jobs = GetJobs(p_jobName, p_jobID, "", JobT<PR>::New); 
      while (jobs.size() > 0) { 
       job = boost::dynamic_pointer_cast<JobT<PR> >(jobs.front()); 
       jobs.pop_front(); 
       if (ClaimJob(job)) return job; 
       else job.reset(); 
      } 
     } 
     return job; 
    } 

を私ができますよJobTのクラスを作成するためにboos_pointerも使用しました。 現在、私は私のインターフェースファイルに次のようなものを持っています:

%template(jobme)JobT; % "boost_shared_ptr.i"を含む %shared_ptr(jobme)

%テンプレート(waitforme)Client :: WaitForJob;

waitforme関数テンプレートはswig pythonオブジェクトへのポインタを返します。これは正しいですが、私はそれをjobmeポインタと同じにします。

これが可能なら誰かが指摘できますか?

答えて

0

戻ってきたSwigオブジェクトはjobmeのプロキシです。必要に応じてJobTのように動作するはずです。

ああ、私は問題があると思う。あなたが持っている各PRためJobTClient::WaitForJobをインスタンス化する必要があります。だから、%templateは、テンプレートを

%include "boost_shared_ptr.i" 
%shared_ptr(JobT<Foo>); 

#include <JobT.hpp> 
%template(Job##NAME) JobT<Foo>; 
%template Client::WaitForJob<Foo>; 

をインスタンス化し、それはあなたがそれをインスタンス化するために使用する可能性のあるすべての可能なタイプを推測しません。

関連する問題