C#SWIG向量<;字符串>;串 < > C++方法,如 std::vector< std::string > getFoo(); void setFoo( const std::vector< std::string > &foo);

C#SWIG向量<;字符串>;串 < > C++方法,如 std::vector< std::string > getFoo(); void setFoo( const std::vector< std::string > &foo);,c#,c++,swig,C#,C++,Swig,我知道很多关于vector和SWIG的内容,但是我还没有看到任何关于转换到/从string[]的内容。每个人都提到使用SWIG模板,如下所示 %template(StringVector) vector<string>; %模板(StringVector)向量; 但这只会创建一个调用方必须知道才能手动封送的数据类型。理想情况下,调用方只需处理string[],然后让SWIG层来解决 在C语言中简单地使用字符串[]/COD>,但在C++中,它变成了代码>矢量< /代码>?> P>

我知道很多关于
vector
和SWIG的内容,但是我还没有看到任何关于转换到/从
string[]
的内容。每个人都提到使用SWIG模板,如下所示

%template(StringVector) vector<string>;
%模板(StringVector)向量;
但这只会创建一个调用方必须知道才能手动封送的数据类型。理想情况下,调用方只需处理
string[]
,然后让SWIG层来解决


<如何>在C语言中简单地使用<代码>字符串[]/COD>,但在C++中,它变成了代码>矢量< /代码>?> P> >一种方法可以添加到生成的StringVector中,以便它能够从/>代码> String []/Cord> 我试着通过一个
类型映射
来实现这一点,但没有成功。但是,这可以通过以下方式完成

看起来像这样。在瑞士

%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,但由于客户机编码人员可以只使用
string[]
,这并不重要。

我觉得这是为了接口兼容性而牺牲了相当多的效率。再说一次,我可能会在紧要关头想出同样的主意+1我认为大多数时候,使用SWIG界面的人都会想要
string[]
,因此他们无论如何都会手动转换它。无论如何,这种方法的一个好处是,如果效率很重要,您可以直接使用StringVector。您不能将StringVector传递给任何泛型方法,并且仍然希望它执行用户定义的转换(没有泛型类型约束)。虽然,C#4.0'
dynamic
可能能够实现它(需要检查)。我们可以将StringVector类保持在内部吗?最好在方法签名中看到
IList
,而不是
StringVector
%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 >;
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;
    }
}
string[] foo= mymodule.getFoo();
string[] thenewfoo= { "one", "two", "three" };
mymodule.setFoo(thenewfoo);