SWIG:带函数模板和共享指针作为返回值的Python回调

1 投票
1 回答
538 浏览
提问于 2025-04-16 09:22

我正在为我的软件库使用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创建一个类,并且我也使用了boost_pointer。

目前在我的接口文件中有以下内容:

%template(jobme) JobT;
%include "boost_shared_ptr.i"
%shared_ptr(jobme)

%template(waitforme) Client::WaitForJob;

waitforme这个函数模板返回一个指向SWIG Python对象的指针。这是正确的,但我希望它和jobme指针是一样的。

有人能告诉我这是否可能吗?

1 个回答

1

你得到的这个Swig对象其实是一个代理,代表着jobme。在你需要使用它的地方,它的工作方式应该和JobT一样。

哦,我想我明白问题出在哪里了。你需要为每一个PR实例化JobTClient::WaitForJob

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

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

所以%template是用来实例化一个模板的,但它并不会自动猜测你可能用来实例化的所有类型。

撰写回答