你能SWIG一个boost :: optional 吗?

我一直在成功使用SWIG构建一个包装器接口,以便在C#中使用我的C ++库。 最近我暴露了一些boost::optional对象,SWIG遇到了问题。 有没有一种标准的方法可以解决这个问题? 有人必须在此之前碰到这个……

由于SWIG不了解boost类型,因此必须编写类型映射。 这是boost::optional的一对类型映射。

从Python,可以将None或整数传递给函数:

 %typemap(in) boost::optional %{ if($input == Py_None) $1 = boost::optional(); else $1 = boost::optional(PyLong_AsLong($input)); %} 

返回的boost::optional将转换为None或Python整数:

 %typemap(out) boost::optional %{ if($1) $result = PyLong_FromLong(*$1); else { $result = Py_None; Py_INCREF(Py_None); } %} 

使用std :: vector的可能的C#解决方案

 #if SWIGCSHARP // C++ %typemap(ctype) boost::optional "void *" %typemap(out) boost::optional %{ std::vector result_vec; if (!!$1) { result_vec = std::vector(1, $1.get()); } else { result_vec = std::vector(); } $result = new std::vector< uint32_t >((const std::vector< uint32_t > &)result_vec); %} // C# %typemap(imtype) boost::optional "global::System.IntPtr" %typemap(cstype) boost::optional "int?" %typemap(csout, excode=SWIGEXCODE) boost::optional { SWIG_IntVector ret = new SWIG_IntVector($imcall, true);$excode if (ret.Count > 1) { throw new System.Exception("Return vector contains more then one element"); } else if (ret.Count == 1) { return ret[0]; } else { return null; } } #endif //SWIGCSHARP