2

给定 C++ 方法,如

std::vector< std::string > getFoo();
void setFoo( const std::vector< std::string > &foo);

我怎样才能让 SWIG 像这样向 C# 公开它

string[] getFoo();
setFoo(string[] foo);

我意识到很多人都询问vector<string>SWIG,但我没有看到任何解决与string[]. 每个人都提到使用 SWIG 模板,就像这样

%template(StringVector) vector<string>;

但这只会创建一个调用者必须知道手动编组的数据类型。理想情况下,调用者只需处理string[]并让 SWIG 层解决。

我怎样才能简单地在 C# 中使用但在 C++ 中string[]变成它?vector<string>

4

1 回答 1

3

一种方法是向 SWIG 生成的 StringVector 添加隐式转换,以便它能够将自身转换为string[].

我尝试通过 a 执行此操作typemap,但无法使其工作。但是,可以使用部分类来完成。

它看起来像这样。在 SWIG 中,

%include std_vector.i
%include std_string.i

/* allow partial c# classes */
%typemap(csclassmodifiers) SWIGTYPE "public partial class"

/* generate template around vector<string> */
%template(StringVector) std::vector< std::string >;

然后在 C# 中,创建 StringVector 的部分版本:

public partial class StringVector: IDisposable, System.Collections.IEnumerable
#if !SWIG_DOTNET_1
    , System.Collections.Generic.IList<string>
#endif
{
    // cast from C# string array
    public static implicit operator StringVector(string[] inVal) {
        var outVal= new StringVector();
        foreach (string element in inVal) {
            outVal.Add(element);
        }
        return outVal;
    }

    // cast to C# string array
    public static implicit operator string[](StringVector inVal) {
        var outVal= new string[inVal.Count];
        inVal.CopyTo(outVal);
        return outVal;
    }
}

这允许您编写如下所示的 C# 代码:

string[] foo= mymodule.getFoo();
string[] thenewfoo= { "one", "two", "three" };
mymodule.setFoo(thenewfoo);

它仍然是 C# 方法签名中的 StringVector,但由于客户端编码器可以使用string[]它并不重要。

于 2013-02-28T22:37:29.190 回答