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++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

IDEA与MyEclipse代码量统计方式

《IDEA与MyEclipse代码量统计方式》文章介绍在项目中不安装第三方工具统计代码行数的方法,分别说明MyEclipse通过正则搜索(排除空行和注释)及IDEA使用Statistic插件或调整搜索... 目录项目场景MyEclipse代码量统计IDEA代码量统计总结项目场景在项目中,有时候我们需要统计

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

MySQL实现多源复制的示例代码

《MySQL实现多源复制的示例代码》MySQL的多源复制允许一个从服务器从多个主服务器复制数据,这在需要将多个数据源汇聚到一个数据库实例时非常有用,下面就来详细的介绍一下,感兴趣的可以了解一下... 目录一、多源复制原理二、多源复制配置步骤2.1 主服务器配置Master1配置Master2配置2.2 从服