swig 用变量扩展模板类

2024-02-12

我正在为模板类构建 Swig 接口。在我的 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您实际上不能添加任何新的成员变量,只能添加成员函数。如果您在以下位置执行此操作,它将假定存在 get/set 函数%extend.

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

如果您想实现 get/set 函数来做一些有用的事情(例如,这里我使用全局映射来存储额外的数据),您不想在内部实现它们%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 自己的损坏系统损坏,因为它是一个模板。我只是查看生成的包装类以了解它们的名称。 (我认为可能有一种更聪明的方法来做到这一点,但我还无法从文档中弄清楚)。如果它不是模板,函数的名称会简单得多。

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

由于您没有指定您使用的语言,我用 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立即声明、定义和包装一个全新的额外类,该类提供您想要的功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

swig 用变量扩展模板类 的相关文章

  • 从 PDF 转换为 HTML [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 ITextSharp 从内存流附加 PDF 文件时遇到问题

    我在附加内存中创建的 PDF 文件并将其附加到电子邮件模板时遇到问题 电子邮件没有任何问题 但没有附件 我不明白为什么会发生这种情况 这是该过程的完整代码 ExtendedEmailTemplate emailTemp new Extend
  • 尝试从 Web 应用程序访问报告服务时,Internet Explorer 导致 IIS 500 错误

    我有一个 aspx Web 表单页面 它调用托管在 SQL 2012 报告服务服务器上的 SQL 2012 SSRS 报表 并使用报表查看器在 aspx 页面上显示报表 问题是当我单击链接将参数发送到报告服务器并运行报告时 页面挂起 仅在
  • 如何将多种语言设置放入单个 .clang-format 文件中

    我想为 java javascript 和 c 创建一个 clang 格式 我知道如何转储单一语言的示例配置 但不知道如何合并这 3 个配置文件 有关如何将多种语言配置放入单个文件中的示例 BasedOnStyle LLVM IndentW
  • 如何在 Mac OS X 中获取 aio 信号处理程序的用户数据

    我尝试在 Mac OS X 下使用 aio 函数进行异步文件 IO 但在将某种形式的用户数据输入信号处理程序时遇到问题 这是设置操作的代码 class aio context public aio context int fildes bo
  • 将二进制文件内容读取到 std::string 的最佳方法是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将 istream 与字符串一起使用 https stackoverflow com questions 6510923 how to use istream with strings std i
  • 在 C# 中将 Exe 文件作为嵌入式资源运行

    我有一个第 3 方 EXE 我只需要从我的 C 应用程序运行它 我的主要目标是对我的 C 文件中的第 3 方可执行文件进行版权保护 有没有更好的方法来做到这一点 我怎样才能做到这一点 首先将嵌入的可执行文件作为资源文件添加到您现有的资源文件
  • 保存到会话状态的 DataTable 丢失事件处理程序

    我有一个来自强类型数据集的数据表 该数据集在 TableNewRow 事件上有一个事件处理程序 用于初始化一些日期字段 当我将此表保存到会话状态时 事件处理程序会正常触发 直到表被序列化 在后续请求中 当我从会话状态检索表时 事件处理程序不
  • 图像的 EMGU/OpenCV FFT 未产生预期结果

    我正在尝试使用 EMGU 可视化图像的 FFT 这是我正在处理的图像 这是预期的结果 Here s what I get 这是我的代码 Image
  • 通过模板参数向类添加方法

    我希望在类中拥有一个模板参数特定函数 取消启用enable if 它的名称保持不变 参数类型有所不同 尽管这应该不相关 因为只有一个被初始化 enum class MyCases CASE1 CASE2 template
  • std::function 中参数的自动动态转换

    我们有多态类 A 和 B 例如 struct A virtual A struct B final public A void f std cout lt lt f lt lt std endl 我想分配一个变量std function
  • 底层连接已关闭:接收时发生意外错误

    我来这里是因为我在通过 ftp 协议下载一些文件时遇到问题 这很奇怪 因为它偶尔会发生 甚至对于同一个文件也是如此 只是一个精确度 我正在下载非常大的文件 从 500 Mo 到 30Go 以下是我的函数返回的异常类型 抱歉 这是法语 Sys
  • 如何使用 PostSharp 拦截基类上的方法调用?

    我想提供一个实现System Object ToString使用 PostSharp 到各种类 我创建了一个继承自的方面MethodInterceptionAspect但是OnInvoke调用时不会调用方法EchoDto ToString发
  • UWP 关闭信息亭模式

    我有一个发布到 Windows 应用商店的 UWP 应用程序 并且该应用程序可以启动进入信息亭模式 分配访问权限 它工作得很好 但我尝试在应用程序上创建一个按钮来关闭信息亭模式并返回到 Windows 登录屏幕 我尝试了文档中给出的代码 h
  • 在 C++ 中的 Switch-Case 中执行 OR 运算

    你会如何在 C 中做到这一点 例如 如果用户按 ESC 或 q 或 Q 我试图触发程序退出 我尝试寻找它 但在 C 中没有找到它的语法 我知道如何使用 if else 来做到这一点 但是可以使用 switch case 来做到这一点吗 当然
  • 非静态类中的静态方法有什么意义?

    我无法理解以下代码的潜在错误 class myClass public void print string mess Console WriteLine mess class myOtherClass public static void
  • 在memcpy缓冲区UB上使用reinterpret_cast吗?

    给定代码 struct A auto obj new A std vector
  • ASP.NET:通过命名空间一次注册多个控件?

    是否可以在 aspx 文件中注册用户控件的完整命名空间 而不是单独注册每个控件 我创建了一堆用户控件并将它们收集到自己的命名空间 MyWebControls 中 如下所示 隐藏代码 namespace MyWebControls publi
  • C++中main函数可以调用自身吗?

    谁能告诉我下面的代码有什么问题吗 int main return main 我测试了一下 编译正确 它永远运行 幕后还有什么阴谋吗 TLDR 呼叫main导致未定义的行为 标准中使用的术语以及对程序员和编译器的影响似乎存在混淆 首先 单独的
  • 为什么 Windows 只允许一个应用程序访问网络摄像头? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我一直在尝试用 C 制作一个示例网络摄像头应用程序 我发现该应用程序无法同时运行 Skype 或 Oovoo 或任何其他应用程序运行 反之亦然 为什么

随机推荐

  • Python 中内置最大堆 API

    默认 heapq 是最小队列实现 想知道是否有最大队列的选项 谢谢 我尝试使用 heapify max 作为最大堆的解决方案 但如何动态处理推送 弹出元素 看来 heapify max 只能在初始化时使用 import heapq def
  • C# 计算两个纬度/经度点之间沿大圆路径的 n 个点数

    我正在将具有纬度和经度值的机场之间的飞行路径绘制到 Google 地图 API v3 上 然而 与 v2 不同的是 v3 似乎没有选项可以在地图上两点之间放置折线并将其显示为大圆飞行路径 所以我的想法是 也许可以计算两个纬度 经度点之间的大
  • 如何将 Perl 嵌入到 C++ 应用程序中?

    我想从我的 C 程序中调用 Perl 脚本文件 我不确定我将分发给的人是否会安装 Perl 基本上 我正在寻找一个可以使用的 lib 文件 该文件具有类似 Apache 的分发许可证 您可以将 Perl 嵌入到您的应用程序中 Perl 嵌入
  • C++ 具有频繁变化概率的离散分布采样

    问题 我需要从由某些权重构成的离散分布中进行采样 例如 w1 w2 w3 因此概率分布为 p1 p2 p3 其中 pi wi w1 w2 有些wi变化非常频繁 但只占所有wi的比例非常低 但分布本身每次发生时都必须重新规范化 因此我相信 A
  • 如何像facebook的照片查看器一样修改历史记录?

    我的网站上有一个弹出模式 类似于 Facebook 的照片查看器 当模式打开时 它显示来自另一个页面的内容 我想更改地址栏值和历史记录以显示这一点 模式中有一个下拉菜单 可以将模式中的内容更改为不同页面的内容 当发生这种情况时 我再次想要更
  • MassTransit/RabbitMq 错误队列 - 如何删除消息?

    我有一个队列 QueueName 我定义了消费者和错误消息消费者如下 cfg ReceiveEndpoint queueName QueueName e gt e UseMessageRetry r gt r Immediate 2 e A
  • 如何选择 mysql 中最新的条目?

    我想从表中选择最新的条目 看看该条目是否与用户尝试输入的条目完全相同 如何执行查询 从最近的 发布 条目中选择 query Select FROM confused here SELECT FROM posting ORDER BY dat
  • 显示对话框片段时未调用 AndroiddispatchKeyEvent

    当我的对话框片段是hide dispatchKeyEvent工作得很好 Override public boolean dispatchKeyEvent KeyEvent event Toast makeText FragmentPlaye
  • 如何在reactjs中管理树组件中的状态

    我已经为此苦苦挣扎了几天 试图找出 反应 的方式来做到这一点 基本上 我有一棵树 一个可以任意嵌套的列表列表 列表 我想要一个能够显示它并启用重新排列的组件 这是我的数据 var data id 1 id 2 children id 3 c
  • WooCommerce REST API - 获取订单的自定义字段

    我正在使用 WooCommerce REST API http woocommerce github io woocommerce rest api docs introduction http woocommerce github io
  • 如何使用rvm升级ruby on Rails应用程序的ruby版本

    如何使用 rvm 安全地升级我的 ruby on Rails 应用程序以使用新的 ruby 版本 假设您的应用程序是 my app 并且您正在使用 ruby 版本 a b c 并且想要转到 ruby 版本 x y z Step 0 开始之前
  • Itunes Connect 将桌面显示为 iPad 应用程序的平台

    今天我注意到 iTunes Connect 销售和趋势部分有了新皮肤和一些新功能 但是我公司的应用程序 仅适用于 iPad iPhone 似乎可以在桌面上下载 有谁知道 桌面 对于 iOS 应用程序意味着什么 它适用于 Mac 应用商店应用
  • Android:GraphView 如何在 X 轴上实现时间?

    我发现很难弄清楚如何在 Android 中的图表的 X 轴上实现时间 这是我的代码 for int i 0 i lt listSize i String onlyReading mData get i getReading split re
  • gem 和插件有什么区别?

    我是 Rails 新手 对 gems 和插件的概念感到困惑 谁能为我解释一下吗 插件只是从特定目录加载的库 gems 通过加载Bundler http gembundler com or RubyGems http rubygems org
  • WCF - 设计参数决策

    我正在为基金管理设计一项服务 基金管理服务有一个名为 UpdateFundApprovalDate FundDTO 基金 的操作 此操作将使用fundingID 的批准日期更新资金表记录 该服务将由 FundManagementUI 客户端
  • SQL 使用 CASE 语句更新列中的行

    我有两个表 用户和 TempTable 它是用户的子集 我想更新 Users 表中的 IsActive 列 如果 TempTable 中的用户也在 Users 表中 我想设置 IsActive 1 否则设置 IsActive 0 从不在 T
  • 如何从传奇中发送重击?

    我知道我不应该尝试从 sagas 中发送 thunks 这违背了 redux saga 试图做的事情 但我正在一个相当大的应用程序中工作 大部分代码都是用 thunk 编写的 我们正在按位迁移 需要从 saga 内部调度 thunk thu
  • 使用 java 编写 .ics iCal 文件

    我正在尝试使用 java 实现我自己的 iCal 创建器 但由于某种原因我无法识别我的 ics 文件 我想知道我做错了什么 我可以获得与维基百科的示例完全相同的输出 ics 文件和我的程序生成的一次文件有什么区别 他们的例子 BEGIN V
  • 运行多个实例时无法启动logstash - path.data 设置

    你好 我是 ELK 堆栈内部的新手 在后台运行一个logstash进程 当它找到匹配的文件模式时 它如下所示 我想了解这里的重要性是什么path data选项 请帮帮我 FATAL logstash runner Logstash coul
  • swig 用变量扩展模板类

    我正在为模板类构建 Swig 接口 在我的 pyinterface i 文件中 我声明 template myclass MyClass