【发布时间】:2012-08-24 04:34:53
【问题描述】:
我发现了这个问题,但一个答案基本上是,你不想这样做:Is it possible to add code to an existing method when using Swig to build a C# wrapper for C++ code?
我实际上同意所描述的情况,即 OP 试图以一种可能很脆弱的方式插入代码。就我而言,我正在按照答案的建议做:重命名方法并使用 %typemap(javacode) 来实现包装方法。
但是我已经把它写成一个宏,我想重写几个方法,所以我最终多次调用 %typecode(javacode) ,只有最后一个包装方法 javacode typemap 是活动的。
宏的细节很复杂,因为它使用变量args来表达签名。
但证明问题:
%define WRAP(CLASS,METHOD)
%rename(method ## _internal,fullname=1) CLASS::METHOD;
%typemap(javamethodmodifiers) CLASS::METHOD "private";
%typemap(javacode) {
public void METHOD() {
METHOD ## _internal(); // delegate to original
// extra code here
}
} // (note: dont use %{ %} -- need macro evaluation)
%enddef
WRAP(Foo,bar)
WRAP(Foo,baz)
class Foo {
void bar();
void baz();
}
只有公共 void baz() { baz_internal(); ... } 生成。 这里的问题是 %rename 和 %typemap(javamethodmodifiers) 是唯一的,因为 CLASS::METHOD 的范围,但 %typemap(javacode) 适用于整个类。如果语法像
%typemap(javacode,append=true) { // code }
得到支持,那么这将解决问题。有没有什么技术可以做到这一点?这对于像 javacode 或 javaimports 这样的类型映射有意义,它们的默认值是空的。
【问题讨论】:
标签: swig