围绕SWIG包装器的自定义包装器

时间:2017-05-31 14:01:28

标签: c# swig

我尝试强制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"

1 个答案:

答案 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;
%}