extending 'incomplete' types (SWIG)

女生的网名这么多〃 提交于 2019-12-18 09:20:46

问题


I'm looking for a way to extend (i.e. add new members to a type using the %extend directive) a type that is defined in the library file itself while the header files of the library provide only a forward declaration for the type.

Treating the type as if its definition is known at compile time, leads to the following warning:

Warning 303: %extend defined for an undeclared class [name of the type].

Is anyone aware of a solution or a workaround for this problem? I'm sure there is one, since SWIG's documentation states that swig assumes that the unknown type is a struct or a union each time it finds one.

Many thanks in advance!


回答1:


You can very easily add extra methods to a type which has been forward declared in SWIG by giving it an empty definition in the interface, e.g.

test.h:

// Forward declare foo
struct foo;

test.i:

%module test

// Tell SWIG to wrap foo "properly", but that you don't know anything about it:
struct foo { };

%include "test.h"

%extend foo {
  void bar() {
    // Do stuff, probably with $self, here
  }
}

The key is that in the interface file you're not actually writing C or C++ in the normal sense, you're telling SWIG what types and what parts of each type to wrap.

Since you will presumably be relying on the library to create and destroy instances you'll also want to add:

%nodefaultctor foo; 
%nodefaultdtor foo; 

In the interface file to suppress the constructor/destructor generation and force it to go through the library.



来源:https://stackoverflow.com/questions/9994887/extending-incomplete-types-swig

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!