我找到了这个问题,但一个答案基本上是,你不想这样做:在使用 Swig 为 C++ 代码构建 C# 包装器时,是否可以向现有方法添加代码?
在所描述的情况下,我实际上同意它,其中 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 这样的类型映射有意义,它们的默认值是空的。