swig shared_ptr 导致对象不透明
swig shared_ptr results in an opaque object
我正在尝试将 C++ 库 SWIG 到 Python。 C++ 函数之一 returns a shared_ptr。我成功地生成了 Python 模块,但是该函数返回给 Python 的对象似乎没有成员。这是 SWIG 处理 shared_ptr 的限制还是我做错了什么?
这是我的代码的大致结构:
//foo.h
namespace MyNamespace
{
class Base {};
template <typename T> class Derived : public Base {};
std::shared_ptr<Base> make_obj();
}
痛饮:
//foo.i
%module foo
%include <std_shared_ptr.i>
%{
#define SWIG_FILE_WITH_INIT
#include "foo.h"
%}
%include "foo.h"
%template(FooA) MyNamespace::Derived< MyNamespace::AAA >;
%template(FooB) MyNamespace::Derived< MyNamespace::BBB >;
%shared_ptr(MyNamespace::Base)
%shared_ptr(FooA)
%shared_ptr(FooB)
我认为你这里的顺序有点不对。请注意,在 shared_ptr
文档中的所有示例中,他们在看到该类型的任何 declaration/definition 之前调用 %shared_ptr
。
关于 %shared_ptr
指令和 FooA/FooB 模板实例的注意事项已更正,我相信这样的事情应该适用于您的示例。
//foo.i
%module foo
%include <std_shared_ptr.i>
%{
#define SWIG_FILE_WITH_INIT
#include "foo.h"
%}
%shared_ptr(MyNamespace::Base)
%shared_ptr(FooA) // This should probably be MyNamespace::Derived<...>
%shared_ptr(FooB) // This should probably be the fully qualified C++ type also
%include "foo.h"
%template(FooA) MyNamespace::Derived< MyNamespace::AAA >;
%template(FooB) MyNamespace::Derived< MyNamespace::BBB >;
我正在尝试将 C++ 库 SWIG 到 Python。 C++ 函数之一 returns a shared_ptr。我成功地生成了 Python 模块,但是该函数返回给 Python 的对象似乎没有成员。这是 SWIG 处理 shared_ptr 的限制还是我做错了什么?
这是我的代码的大致结构:
//foo.h
namespace MyNamespace
{
class Base {};
template <typename T> class Derived : public Base {};
std::shared_ptr<Base> make_obj();
}
痛饮:
//foo.i
%module foo
%include <std_shared_ptr.i>
%{
#define SWIG_FILE_WITH_INIT
#include "foo.h"
%}
%include "foo.h"
%template(FooA) MyNamespace::Derived< MyNamespace::AAA >;
%template(FooB) MyNamespace::Derived< MyNamespace::BBB >;
%shared_ptr(MyNamespace::Base)
%shared_ptr(FooA)
%shared_ptr(FooB)
我认为你这里的顺序有点不对。请注意,在 shared_ptr
文档中的所有示例中,他们在看到该类型的任何 declaration/definition 之前调用 %shared_ptr
。
关于 %shared_ptr
指令和 FooA/FooB 模板实例的注意事项已更正,我相信这样的事情应该适用于您的示例。
//foo.i
%module foo
%include <std_shared_ptr.i>
%{
#define SWIG_FILE_WITH_INIT
#include "foo.h"
%}
%shared_ptr(MyNamespace::Base)
%shared_ptr(FooA) // This should probably be MyNamespace::Derived<...>
%shared_ptr(FooB) // This should probably be the fully qualified C++ type also
%include "foo.h"
%template(FooA) MyNamespace::Derived< MyNamespace::AAA >;
%template(FooB) MyNamespace::Derived< MyNamespace::BBB >;