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ı?
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; } ' –
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
Sorudaki örneği düzeltmek ve bunu bir cevap olarak yazmak ister misiniz? – Flexo