考虑以下两个类
#include <iostream>
using namespace std;
#ifndef SWIG
class Foo
{
public:
explicit Foo( const char * const arg ) : arg( arg )
{
cout << "create a foo class" << endl;
}
void print_foo( void ) const
{
cout << "this is a foo class: "
<< static_cast<const void*>( this )
<< " - " << arg
<< endl;
}
private:
string arg;
};
#endif
class Bar
{
public:
Bar()
{
cout << "created a Bar class" << endl;
}
void function_one( const Foo & c1 )
{
c1.print_foo( );
}
void function_two( const Foo & c1 )
{
c1.print_foo( );
}
void function_three( const Foo & c1 )
{
c1.print_foo( );
}
void function_four( const Foo & c1 )
{
c1.print_foo( );
}
};
我想通过SWIG将Bar类用于脚本语言。 在这个例子中,Foo可以看作是一个特殊的字符串类,它在脚本端不可用/不可见。 为了做到这一点,我可以在我的bar.i文件中创建一些包装函数:
%module bar
%include "typemaps.i"
%{
#include "bar.hpp"
%}
class Bar
{
public:
Bar();
void function_one( const char * const arg )
{
function_one( Arg_Class( arg ) );
}
void function_two( const char * const arg )
{
function_two( Arg_Class( arg ) );
}
void function_three( const char * const arg )
{
function_three( Arg_Class( arg ) );
}
void function_four( const char * const arg )
{
function_four( Arg_Class( arg ) );
}
void function_one( const char * const arg )
{
function_one( Arg_Class( arg ) );
}
};
但是不是很好,因为它需要大量的复制粘贴。 有没有办法告诉Swig,它会自动创建这样的包装?
如果能做类似
的事情会很好%module bar
%include "typemaps.i"
%{
#include "bar.hpp"
%}
%include "bar.hpp"
并且类型为Foo的所有参数都会自动换行,可以使用char*
参数调用这些方法。