2011-01-04 1 views
0

Я создаю оберток с помощью SWIG для питона для моей библиотеки программного обеспечения и у меня есть следующие функции:SWIG: питон обратного вызова с шаблоном функции и общий указатель в качестве возвращаемого значения

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)

% template (waitforme) Клиент :: WaitForJob;

Шаблон функции waitforme возвращает указатель на объект swig python. Это правильно, но я хочу, чтобы он был таким же, как указатель jobme.

Может кто-нибудь указать, возможно ли это?

ответ

0

Объект Swig, который вы возвращаете, является прокси-сервером для jobme. Он должен работать так же, как JobT, где бы вы ни нуждались.

А, кажется, я вижу проблему. Вам нужно создать экземпляр JobT и Client::WaitForJob для каждого PR у вас есть:

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

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

Так %template конкретизирует шаблон, но он не догадывается все возможные типы можно использовать, чтобы создать его экземпляр с.

Смежные вопросы