gpt4 book ai didi

C# SWIG vector 到 string[]

转载 作者:搜寻专家 更新时间:2023-10-31 01:50:26 25 4
gpt4 key购买 nike

给定 C++ 方法如

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

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

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

我意识到很多 people have asked关于vector<string>和 SWIG,但我还没有看到任何解决与 string[] 之间的转换的问题.每个人都提到使用 SWIG 模板,就像这样

%template(StringVector) vector<string>;

但这只是创建了一个数据类型,调用者必须知道该数据类型才能手动编码。理想情况下,调用者只需要处理 string[]并让 SWIG 层解决这个问题。

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

最佳答案

一种方法是添加 implicit casting到 SWIG 生成的 StringVector,以便它能够将自身转换为 string[]

我尝试通过 typemap 来完成此操作,但无法正常工作。但是,可以使用 partial classes 来完成。 .

看起来像这样。在 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[],所以这并不重要。

关于C# SWIG vector<string> 到 string[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15147026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com