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

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni