gpt4 book ai didi

c++ - SIP4 中的共享指针和构建(原为 : Dynamic casting in SWIG/python? )

转载 作者:太空狗 更新时间:2023-10-29 23:20:11 24 4
gpt4 key购买 nike

所以我正在研究 Python、C++0x 和 SWIG 2.0。我有一个看起来像这样的标题:

#include <string>
#include <iostream>
#include <memory>
using namespace std;

struct Base {
virtual string name();
int foo;
shared_ptr<Base> mine;
Base(int);
virtual ~Base() {}
virtual void doit(shared_ptr<Base> b) {
cout << name() << " doing it to " << b->name() << endl;
mine = b;
}
virtual shared_ptr<Base> getit() {
return mine;
}
};

struct Derived : Base {
virtual string name();
int bar;
Derived(int, int);
};

同时,接口(interface)文件如下所示:

%module(directors="1") foo
%feature("director");

%include <std_string.i>

%include <std_shared_ptr.i>
%shared_ptr(Base)
%shared_ptr(Derived)

%{
#define SWIG_FILE_WITH_INIT
#include "foo.hpp"
%}

%include "foo.hpp"

然后我的 Python session 是这样的:

>>> import foo
>>> b = foo.Base(42)
>>> d = foo.Derived(23,64)
>>> b.doit(d)
Base doing it to Derived
>>> g = b.getit()
>>> g
<foo.Base; proxy of <Swig Object of type 'std::shared_ptr< Base > *' at 0x7f7bd1391930> >
>>> d
<foo.Derived; proxy of <Swig Object of type 'std::shared_ptr< Derived > *' at 0x7f7bd137ce10> >
>>> d == g
False
>>> d is g
False
>>> d.foo == g.foo
True
>>> d.bar
64
>>> g.bar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Base' object has no attribute 'bar'

我似乎无法弄清楚如何在这里检索“原始”代理对象。我必须为每个基类生成一个函数来执行 dynamic_pointer_cast 吗?如果是这样,用 Python 实现的 Director 子类又如何呢?

我觉得我可以在这里打开一个开关或功能,让 SWIG 进行必要的表查找并生成我想要的对象,但我还没有找到它。

(注意:如果我使用原始指针而不是共享指针,行为是相似的,而且我也不知道如何让 SWIG 到 dynamic_cast 那些)

更新

如果这种行为(具体来说,从包含指向基类的指针的 C++ 容器类中检索最派生的代理)在 SWIG 中是不可能的,那么 SIP 或其他一些 Python 包装器生成器怎么样?

更新#2

由于 SIP4 看起来在明智地检索包装对象方面效果更好,我将再次更改问题。查看下面我的 self 回答,了解有关我当前问题的详细信息。对于最初的 SWIG 问题,我仍然会接受一个很好的答案,因为我总体上更喜欢它,但我的新问题基本上是:

  • 我如何理智地处理围绕 shared_ptr 的包装器而不是原始指针?如果有帮助,我所有的类都从它们的通用基类继承enable_shared_from_this,并公开一个适当的函数来获取共享指针。

  • 如何使用 SIP4 的构建系统(Makefile 生成器或 distutils 扩展)构建我的小示例项目,而无需先生成和安装共享库或手动编辑生成的 Makefile?

最佳答案

为了(部分)回答我自己的问题,SIP 似乎做了正确的事情,无论是对于 C++“派生”类还是 Python 级子类——至少,当我使用原始指针时。

看来我需要弄清楚如何让它与 shared_ptr 一起工作s(在 SWIG 中看起来不如 %include <std_shared_ptr.i> 简单)。

另外,SIP 的两个“构建​​系统”选项(Makefile 生成器和 distutils 扩展)看起来有点奇怪。他们手册中的两个例子都“不起作用”——看起来他们希望很明显你应该在你的库中编译和安装一个共享库和头文件/包含你正在尝试的小 Hello World 库的路径包裹。也许我错过了一个“我只想在这里构建和运行这个独立的东西”选项,但即使是python setup.py build_ext --inplace失败是因为它找不到我放在当前目录 中的包装 header ,我知道这显然是一个令人困惑的地方。

关于c++ - SIP4 中的共享指针和构建(原为 : Dynamic casting in SWIG/python? ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3217004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com