我尝试强制SWIG在"默认"周围使用我自己的包装器。生成包装器,这是一个例子......
我有以下"界面"代码:
template<typename T>
class Expected
{
public:
T Value();
};
%template(Expected_Int) Expected<int>;
%template(Expected_Bool) Expected<bool>;
%template(Expected_Void) Expected<void>;
我自己的C#实现(我自己的包装器)
public class Expected
{
public Expected(Expected_Void private) {...}
}
在其他类中,我使用预期的返回值,如下所示&#34;预期的setHandle(IViewHandle * handle)&#34;和SWIG生成此代码:
public override Expected_Void setHandle(IViewHandle handle) {
Expected_Void ret = new Expected_Void(luciadsdkPINVOKE.ViewContext_setHandle(swigCPtr, IViewHandle.getCPtr(handle)), true);
if (luciadsdkPINVOKE.SWIGPendingException.Pending) throw luciadsdkPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
现在,我希望生成以下C#代码(有我自己的SWIG包装器包装器)
public override Expected setHandle(IViewHandle handle) {
Expected_Void ret = new Expected_Void(luciadsdkPINVOKE.ViewContext_setHandle(swigCPtr, IViewHandle.getCPtr(handle)), true);
if (luciadsdkPINVOKE.SWIGPendingException.Pending) throw luciadsdkPINVOKE.SWIGPendingException.Retrieve();
return Expected(ret);
}
有可能吗?
由于
解决方案
%typemap(csout,excode=SWIGEXCODE) Expected<void> {
IExpected ret = new IExpected($imcall, true);$excode
return ret;
}
%typemap(cstype) Expected<void> "IExpected"
答案 0 :(得分:1)
你没有发布它,但我猜你的C ++方法setHandle看起来像:
Expected<void> setHandle(IViewHandle);
因此,如果您只想修改此方法的返回类型,可以设置%typemap(csout),如下所示:
%typemap(csout) Expected<void> MyClass::setHandle %{
Expected_void ret = $imcall;$excode
return Expected(ret);
%}
我认为这应该有效。也许我忘记了什么,但是看看this,也许你会找到更多的信息。
希望它有所帮助。
编辑:
实际上不会起作用,这就是我的意思:
%typemap(csout) Expected<void> MyClass::setHandle %{
Expected ret = new Expected($imcall);$excode
return ret;
%}