SWIG: обратный вызов Python с шаблоном функции и общим указателем в качестве возвращаемого значения - PullRequest
0 голосов
/ 04 января 2011

Я создаю оболочки, используя 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. В настоящее время в моем файле интерфейса есть следующее:

% шаблона (jobme) JobT; % включают "boost_shared_ptr.i" % Shared_ptr (jobme)

% template (waitforme) Client :: WaitForJob;

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

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

1 Ответ

0 голосов
/ 03 октября 2011

Возвращаемый объект 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 создает экземпляр шаблона, но он не угадывает все возможные типы, которые вы можете использовать для его создания.

...