本文主要是介绍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++模板代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!