2015-04-17 12 views
15

Kendiliğinden bir std::vector<T> saran bir şablon sınıfı içeren bazı C++ kodlarını (C# olarak) sarmak için SWIG kullanıyorum. İnternette, vektör türleri için şablonların nasıl ilan edileceğine dair çeşitli referanslar görmüştüm, ancak bunu ekstra bir soyutlama katmanı ile çalışamıyorum. Bu benim örneğin interface.i dosyasında yapıyorum budur: Bu kendileri tarafından doğru gelen C# türleri oluşturmak gibi görünürkenVektör şablonlarını içeren bir şablon sınıfını sararken SWIG şablonlar nasıl uygulanır?

// interface.i file  
%module myNamespaceWrapper 
%{ 
#include "myVector.h" 
%} 

%include "myVector.h" 
%include "std_string.i" 
%include "std_vector.i" 

namespace std { 
%template(vector_MyType) vector<MyType*>; 
%template(vector_Int) vector<int>; 
} 

namespace myNamespace { 
%template(myVectorMyType) myVector<MyType*>; 
%template(myVectorInt) myVector<int>; 
} 

, tanımlamam çalıştık std :: vector şablonları uygulanmaz Başlık dosyalarını kullanarak dahili olarak kullanan diğer sınıflara. Ne demek istediğimi göstermek için, orada bir C++ sınıfı gibi: o böyle çokça örnek vererek yerine kullanmaktan ve olmaması benim şablon sınıf sarar zaman yudum tarafından oluşturulan bir vector_MyType sınıf verseler de

// myVector.h 
namespace myNamespace 
{  
    template<class T> 
    class myVector 
    { 

    private : 
     std::vector<T> vect; 

    public : 
     myVector(){} 
     virtual ~myVector(){} 

     virtual const std::vector<T> & getVect() 
     { 
      return vect; 
     } 

     virtual T& front() 
     { 
      return vect.front(); 
     } 
    } 
} 

:

public class myVectorMyType : global::System.IDisposable { 

    public virtual SWIGTYPE_p_p_myNamespace__MyType front() { 
     SWIGTYPE_p_p_myNamespace__MyType ret = new SWIGTYPE_p_p_myNamespace__MyType(myNamespaceWrapperPINVOKE.myVectorMyType_front__SWIG_0(swigCPtr), false); 
     return ret; 
    } 

    public virtual SWIGTYPE_p_myNamespace__std__vectorT_myNamespace__MyType_p_t getVect() { 
     SWIGTYPE_p_myNamespace__std__vectorT_myNamespace__MyType_p_t ret = new SWIGTYPE_p_myNamespace__std__vectorT_myNamespace__MyType_p_t(myNamespaceWrapperPINVOKE.myVectorMyType_getVect(swigCPtr), false); 
     return ret; 
    } 
} 

birinin MyType ve vector_MyType yerine SWIGTYPE_p_myNamespace__std__vectorT_myNamespace__MyType_p_t ve SWIGTYPE_p_p_myNamespace__MyType kullanarak sarmalayıcı oluşturmak için SWIG için eksik ben tavsiyelerde bulunabilir lütfen?

int bir işaretçi olmadığı durumlarda, yani ben %template(myVectorInt) myVector<int>; vaka için farklı bir işlem yapmanız gerekir, T& dönen şablonun getvect() fonksiyonu ile ilgisi bu şey var mı?

+2

kullandığınız yudum in versiyonu? Örneğini 2.0.11 ve 3.0.5 ve C# kaynaklarının doğru olarak üretildiği yerde denedim, örneğin: "public virtual vector_MyType getVect() { vector_MyType ret = new vector_MyType (myNamespaceWrapperPINVOKE.myVectorMyType_getVect (swigCPtr), false); dönüşü ret; } ' –

+0

Bunu denediğiniz için teşekkürler! Ayrıca 3.0.5 kullanıyorum. Çalıştığından beri problemimi kodumla bulabiliyordum. Tam olarak bu soruya koyduğum gibi değildi, aslında fazladan bir isim kullanmıştım. '' Namespace myNamespace {} 'bölümünde sorun yaratıyordu. Bunu kaldırmak, beklendiği gibi çalışır. – SWilliams

+0

Sorudaki örneği düzeltmek ve bunu bir cevap olarak yazmak ister misiniz? – Flexo

cevap

0

hatamı fark ve beklendiği gibi yudum sınıfları oluşturulmuş.

// interface.i file  
%module myNamespaceWrapper 
%{ 
#include "myVector.h" 
%} 

%include "myVector.h" 
%include "std_string.i" 
%include "std_vector.i" 

namespace std { 
%template(vector_MyType) vector<MyType*>; 
%template(vector_Int) vector<int>; 
} 

namespace myNamespace { 
// using namespace std; // don't include this! 
%template(myVectorMyType) myVector<MyType*>; 
%template(myVectorInt) myVector<int>; 
} 

Bu gibi sınıflar üretti: altta yatan vector_MyType std_vector.i şablon başına gibidir

public class myVectorMyType : global::System.IDisposable { 
    private global::System.Runtime.InteropServices.HandleRef swigCPtr; 
    protected bool swigCMemOwn; 

    ... 

    public virtual vector_MyType getVect() { 
    vector_MyType ret = new vector_MyType(myNamespaceWrapperPINVOKE.myVectorMyType_getVect(swigCPtr), false); 
    return ret; 
    } 
} 

:

public class vector_MyType: global::System.IDisposable, global::System.Collections.IEnumerable 
    , global::System.Collections.Generic.IList<MyType> 
{...} 
0

Sorunu kaçınarak tavsiye ve sadece ihtiyacınız her örnekleme için mahfazalar oluşturmak olacaktır: Sonunda

class wrap_int : public temp <int> 
{ 
};