SWIG:自动参数包装

时间:2016-05-01 14:55:50

标签: c++ arguments swig

考虑以下两个类

#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*参数调用这些方法。

0 个答案:

没有答案