gpt4 book ai didi

c++ - swig 使用变量扩展模板类

转载 作者:太空狗 更新时间:2023-10-29 23:07:53 25 4
gpt4 key购买 nike

我正在为模板类构建一个 Swig 接口(interface)。在我的 pyinterface.i 文件中,我声明

%template (myclass) MyClass<int>;

现在我想做的是向我的新类添加一个字段变量,我认为应该这样做

%extend MyClass<int>{
double x;
}

然而,这个提示没有

myclass_get_x

方法定义。因此,如果我尝试通过将上面的内容修改为:

%extend MyClass<int>{
double x;
double MyClass<int>_get_x(MyClass<int> *f){
return (*f)->x;
}
}

然后我得到语法错误。

我试过这样做:

%extend myclass{
double x;
double myclass_get_x(myclass *f){
return (*f)->x;
}
}

但这也会引发错误,因为 myclass 似乎还没有被理解。

最佳答案

当您使用 %extend 扩展一个类时,您实际上不能添加任何新的成员变量,只能添加成员函数。如果您在 %extend 中执行此操作,它将假定存在 get/set 函数。

这样做的原因是新成员变量的存储(即内存)必须位于某个地方,但没有明显的安全位置来放置它。您不能修改原始的 C++ class,因为如果您这样做,当其他一些预编译代码使用该类的旧定义时,您将以未定义的行为结束;没有办法追溯应用新定义。你不能把它放在用目标语言生成的代理中,因为 C++ 类的实例和目标语言中的代理之间没有 1:1 的映射。 (考虑两个函数,它们都通过指针返回相同的全局实例,以了解如何发生这种情况的简单示例)。

如果你想实现 get/set 函数来做一些有用的事情(例如,这里我使用全局 map 来存储额外的数据)你不想在 %extend 中实现它们对于例如,给定 test.hh 只是:

template <typename T>
struct Foo {};

你可以使用 std::map 来做你想做的事情,方法是在包装器中编写你自己的获取和设置作为自由函数 - %{ %} 直接传递代码:

%module test

%include "test.hh"

%{
#include "test.hh"
%}

%{
#include <map>
static std::map<Foo<int>*, double> extra_stuff;

const double& Foo_Sl_int_Sg__x_get(Foo<int>* f) {
return extra_stuff[f];
}

void Foo_Sl_int_Sg__x_set(Foo<int>* f, const double& d) {
extra_stuff[f] = d;
}
%}

%template(FooInt) Foo<int>;

%extend Foo<int> {
double x;
}

get/set 函数被 SWIG 自己的修改系统修改,因为它是一个模板。我只是查看生成的包装器类以查看它们的名称。 (我认为可能有更聪明的方法来做到这一点,但我还无法从文档中弄清楚)。如果不是模板,函数的名称会简单得多。

请注意,这里没有规定永远从这张 map 中删除条目 - 它只会无限期地增长。 (例如,您可以通过提供一个在对象生命周期结束时调用额外函数的类型映射来解决这个问题)。您还需要注意线程。

因为你没有指定你使用的是什么语言,所以我用 Java 测试了上面的代码:

public class run {
public static void main(String[] argv) {
System.loadLibrary("test");
FooInt f = new FooInt();
f.setX(0.1);
System.out.println(f.getX());
}
}

或者,如果您真的想要,您可以编写代码以确保在目标语言中有一个唯一的代理实例,方法是编写一个类型映射来检查是否已创建代理而不是总是创建一个,但这会引发引用计数和线程安全问题难以有效和通用地解决,这就是为什么它不是默认行为的原因。

不过,在很多情况下(例如目标语言中的迭代器),最简单的解决方法是使用 %inline 一次性声明、定义和包装一个全新的额外类,该类提供您想要的功能。

关于c++ - swig 使用变量扩展模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11340349/

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