2

与えられたC++メソッドのような

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

SWIGでこのようにC#に公開するにはどうすればよいですか?

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

多くの人がSWIGについて質問していることを認識していますがvector<string>、への/からの変換に対処するものは何も見ていませんstring[]。誰もがこのようなSWIGテンプレートの使用について言及しています

%template(StringVector) vector<string>;

ただし、これにより、呼び出し元が手動でマーシャリングするために知っておく必要のあるデータ型が作成されます。string[]理想的には、発信者はSWIGレイヤーに対処し、それを理解させるだけで済みます。

string[]どうすればC#で簡単に使用できますがvector<string>、C ++で使用できますか?

4

1 に答える 1

3

1つのアプローチは、SWIGで生成されたStringVectorに暗黙のキャストを追加して、から/に自分自身をキャストできるようにすることstring[]です。

を介してこれを実行しようとしました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 に答える