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

相关文章

Java进行日期解析与格式化的实现代码

《Java进行日期解析与格式化的实现代码》使用Java搭配ApacheCommonsLang3和Natty库,可以实现灵活高效的日期解析与格式化,本文将通过相关示例为大家讲讲具体的实践操作,需要的可以... 目录一、背景二、依赖介绍1. Apache Commons Lang32. Natty三、核心实现代

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

SpringBoot实现二维码生成的详细步骤与完整代码

《SpringBoot实现二维码生成的详细步骤与完整代码》如今,二维码的应用场景非常广泛,从支付到信息分享,二维码都扮演着重要角色,SpringBoot是一个非常流行的Java基于Spring框架的微... 目录一、环境搭建二、创建 Spring Boot 项目三、引入二维码生成依赖四、编写二维码生成代码五

C++类和对象之初始化列表的使用方式

《C++类和对象之初始化列表的使用方式》:本文主要介绍C++类和对象之初始化列表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C++初始化列表详解:性能优化与正确实践什么是初始化列表?初始化列表的三大核心作用1. 性能优化:避免不必要的赋值操作2. 强

C++迭代器失效的避坑指南

《C++迭代器失效的避坑指南》在C++中,迭代器(iterator)是一种类似指针的对象,用于遍历STL容器(如vector、list、map等),迭代器失效是指在对容器进行某些操作后... 目录1. 什么是迭代器失效?2. 哪些操作会导致迭代器失效?2.1 vector 的插入操作(push_back,

C#实现高性能Excel百万数据导出优化实战指南

《C#实现高性能Excel百万数据导出优化实战指南》在日常工作中,Excel数据导出是一个常见的需求,然而,当数据量较大时,性能和内存问题往往会成为限制导出效率的瓶颈,下面我们看看C#如何结合EPPl... 目录一、技术方案核心对比二、各方案选型建议三、性能对比数据四、核心代码实现1. MiniExcel

POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能

《POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能》ApachePOI是一个流行的Java库,用于处理MicrosoftOffice格式文件,提供丰富API来创建、读取和修改O... 目录前言:Apache POIEasyPoiEasyExcel一、EasyExcel1.1、核心特性

使用Python和PaddleOCR实现图文识别的代码和步骤

《使用Python和PaddleOCR实现图文识别的代码和步骤》在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等,PaddleOCR是百度开源的一款强大的OCR工具包,它集成了... 目录一、引言二、环境准备2.1 安装 python2.2 安装 PaddlePaddle2.3 安装

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与