SWIG导出复杂C++模板代码

2024-03-05 01:28

本文主要是介绍SWIG导出复杂C++模板代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • SWIG模板导出
      • SWIG模板导出技巧
    • SWIG模板导出工程实践
    • 模板导出库的使用

从SWIG 4.2.0开始, SWIG开始支持导出如下复杂模板代码.

SWIG模板导出

比如支持类似swig-4.2.1/Examples/test-suite/template_template_template_parameters.i含有大量复杂模板的代码:

%module template_template_template_parameters%inline %{
// Github issue #624
class CustomAttrs {
public:enum dattr1d {pos, vel, someCustomCaseVar, d1dLast};
};template <class TT> 
class A {
public:TT attributes;virtual ~A() {}
};template <template<class> class A, class T>
class B : public A<T> {
public:virtual void BMethod(T t_parm, A<T> at_parm) {}
};template <template<template<class> class, class> class Op, template<class> class X, class Y>
class C : public Op<X,Y> {
public:virtual void CMethod(Y y_parm, Op<X, Y> opxy_parm) {}
};template <template<template<class K1> class K2, class K3> class L, template<class K4> class M, class N>
class D : public L<M,N> {
public:virtual void DMethod(N n_parm, L<M, N> lmn_parm) {}
};
%}%{
template class A<CustomAttrs>;
template class B<A, CustomAttrs>;
template class C<B, A, CustomAttrs>;
template class D<B, A, CustomAttrs>;
%}%template(AC) A<CustomAttrs>;
%template(BAC) B<A, CustomAttrs>;
%template(CBAC) C<B, A, CustomAttrs>;
%template(DBAC) D<B, A, CustomAttrs>;

样例是头文件和.i文件all in one的写法, 这样的好处是方便测试, 不用将.h和.i文件分开.

SWIG模板导出技巧

这里有个小的诀窍, 对于接口导出快速测试, 最开始可以将代码中的%inline去掉, 如果使用
下面的命令:

swig -c++ -python template_template_template_parameters.i

运行没有错误, 说明代码没有C++语法语义错误; 然后再将%inline加上, 如果运行依然没有报错, 说明代码可以正常导出.

SWIG模板导出工程实践

一般的工程实践中, .h和.i文件均应该分开, 上面all in one写法,
等价于头文件example.h:

class CustomAttrs {
public:enum dattr1d {pos, vel, someCustomCaseVar, d1dLast};
};template <class TT> 
class A {
public:TT attributes;virtual ~A() {}
};template <template<class> class A, class T>
class B : public A<T> {
public:virtual void BMethod(T t_parm, A<T> at_parm) {}
};template <template<template<class> class, class> class Op, template<class> class X, class Y>
class C : public Op<X,Y> {
public:virtual void CMethod(Y y_parm, Op<X, Y> opxy_parm) {}
};template <template<template<class K1> class K2, class K3> class L, template<class K4> class M, class N>
class D : public L<M,N> {
public:virtual void DMethod(N n_parm, L<M, N> lmn_parm) {}
};template class A<CustomAttrs>;
template class B<A, CustomAttrs>;
template class C<B, A, CustomAttrs>;
template class D<B, A, CustomAttrs>;

example.i文件:

%module template_template_template_parameters
%include "example.h"%{
#include "example.h"
%}%template(AC) A<CustomAttrs>;
%template(BAC) B<A, CustomAttrs>;
%template(CBAC) C<B, A, CustomAttrs>;
%template(DBAC) D<B, A, CustomAttrs>;

在CMake系统中, 可以通过swig_add_library等方式导出python库template_template_template_parameters

模板导出库的使用

在python语言中, 可以类似如下使用导出的模板库:

from template_template_template_parameters import *
attr=CustomAttrs()
ac=AC()
bac=BAC()
bac.BMethod(attr, ac)

这篇关于SWIG导出复杂C++模板代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/774890

相关文章

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

什么是 Java 的 CyclicBarrier(代码示例)

《什么是Java的CyclicBarrier(代码示例)》CyclicBarrier是多线程协同的利器,适合需要多次同步的场景,本文通过代码示例讲解什么是Java的CyclicBarrier,感... 你的回答(口语化,面试场景)面试官:什么是 Java 的 CyclicBarrier?你:好的,我来举个例

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

基于Canvas的Html5多时区动态时钟实战代码

《基于Canvas的Html5多时区动态时钟实战代码》:本文主要介绍了如何使用Canvas在HTML5上实现一个多时区动态时钟的web展示,通过Canvas的API,可以绘制出6个不同城市的时钟,并且这些时钟可以动态转动,每个时钟上都会标注出对应的24小时制时间,详细内容请阅读本文,希望能对你有所帮助...

HTML5 data-*自定义数据属性的示例代码

《HTML5data-*自定义数据属性的示例代码》HTML5的自定义数据属性(data-*)提供了一种标准化的方法在HTML元素上存储额外信息,可以通过JavaScript访问、修改和在CSS中使用... 目录引言基本概念使用自定义数据属性1. 在 html 中定义2. 通过 JavaScript 访问3.

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像

C++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值

SpringBoot实现导出复杂对象到Excel文件

《SpringBoot实现导出复杂对象到Excel文件》这篇文章主要为大家详细介绍了如何使用Hutool和EasyExcel两种方式来实现在SpringBoot项目中导出复杂对象到Excel文件,需要... 在Spring Boot项目中导出复杂对象到Excel文件,可以利用Hutool或EasyExcel

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、