2010-03-01 17 views
6

var mıdır/dan dönüştürmek için herhangi kolay kullanımlı, üst düzey sınıfları veya kitaplıklar o Visual C VARIANT s ile etkileşime izin ++?basit bir yolu C VARIANT türleri ++

Özellikle, POD türleri (örneğin double, long), yaylı (örneğin CString) ve konteyner (örneğin std::vector) ve VARIANT s arasında dönüştürme istiyorum. Örneğin:

long val = 42; 
VARIANT var; 
if (ToVariant(val, var)) ...  // tries to convert long -> VARIANT 
comObjPtr->someFunc(var); 

std::vector<double> vec; 
VARIANT var = comObjPtr->otherFunc(); 
if (FromVariant(var, vec)) ... // tries VARIANT -> std::vector<double> 

Ben (? safça) COM ile çalışan kişiler bu hep yapıyor farz, böylece büyük olasılıkla dönüşümlerin her türlü işleyen bir tek kullanışlı kütüphane olacaktı. Ama bulmak mümkün oldum hepsi her birkaç türde dönüştürdüğünü sarıcı sınıfların rengarenk çeşitler geçerli: POD türleri için

için CComSafeArray veya SAFEARRAY herhangi basit bir yolu var mı - Visual Basic geçiş kısa - garip belleğin yönetmek bu kabus önlemek için ment ve VT_ARRAY | VT_I4 kodu?

İlgili sorular:

+0

Soru, [C++] (bu yapıya sahip değildir), sadece görsel lehçe için geçerli değildir. – dmckee

+0

@dmckee: haklısın. –

+0

POD'un burada ne anlama geldiğini merak eden herkes için bir yığın taşması yanıtıdır. http://stackoverflow.com/questions/146452/what-are-pod-types-in-c –

cevap

4

Eh, zor işlerin çoğunu zaten çeşitli sarıcı sınıflar ile sizin için yapılır. POD türlerine ve dizelerine dönüştürme için daha uygun oldukları için _variant_t ve _bstr_t'yi tercih ederim. Basit diziler için, gerçekten ihtiyacınız olan şey şablon dönüştürme işlevidir. Aşağıdaki gibi bir şey: dizi POD olmayan türleri içerir, ama yine de yapılabilir ise kurs şeyin arasından

// parameter validation and error checking omitted for clarity 
template<typename T> 
void FromVariant(VARIANT Var, std::vector<T>& Vec) 
{ 
    CComSafeArray<T> SafeArray; 
    SafeArray.Attach(Var.parray); 
    ULONG Count = SafeArray.GetCount(); 
    Vec.resize(Count); 
    for(ULONG Index = 0; Index < Count; Index++) 
    { 
     Vec[Index] = SafeArray[Index]; 
    } 
} 
.... 
std::vector<double> Vec; 
VARIANT Var = ...; 
FromVariant(Var, Vec); 
... 

(bellek/yaşam boyu yönetimine ilişkin olarak) kıllı olsun.

+0

Teşekkürler - bu yararlı ve ne yapmak için kendimi istifa ettim. Söylediğiniz gibi, eksik olan POD desteği değildir ve belki de kontrol/zorlama yazabilir (örneğin, ikilinin bir varyantını bir vektörün vektörüne dönüştürür). –