2010-03-01 11 views
6

czy są jakieś łatwy w obsłudze, klasy high-level lub biblioteki, które pozwalają na interakcję z VARIANT s w Visual C++?Prostym sposobem konwersji do/od rodzaju wariant, w C++

Dokładniej, ja jak do konwersji typu POD (np double, long) łańcuchów (np CString) i pojemników (na przykład std::vector) i VARIANT s. Na przykład:

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> 

I (? Naiwnie) zakłada się, że osoby pracujące z COM robić to cały czas, więc najprawdopodobniej będzie pojedynczy wygodna biblioteka który obsługuje wszystkie rodzaje konwersji. Ale wszystko, co udało mi się znaleźć to zbieranina asortyment klas otoki, że każdy konwertować kilka typów:

Czy jest jakiś prosty sposób - krótkie przejście do Visual Basic - aby uniknąć tego koszmaru niewygodnej pamięci zarządzać i kod bitowy VT_ARRAY | VT_I4?

Powiązane pytania:

+0

Pytanie tak naprawdę nie dotyczy [C++] (które nie ma tego konstruktu), tylko wizualny dialekt. – dmckee

+0

@dmckee: prawda jesteś. –

+0

Każdy, kto jest ciekawy, co oznacza POD, to odpowiedź przepełnienia stosu. http://stackoverflow.com/questions/146452/what-are-pod-types-in-c –

Odpowiedz

4

Cóż, większość ciężkiej pracy jest już wykonane z różnych klas owijki. Preferuję _variant_t i _bstr_t, ponieważ są one bardziej odpowiednie do konwersji do/z typów POD i łańcuchów. W przypadku prostych tablic wszystko, czego naprawdę potrzebujesz, to funkcja konwersji szablonów. Coś jak następuje:

// 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); 
... 

oczywiście rzeczy dostać owłosione (w odniesieniu do pamięci/zarządzania dożywotnią) jeśli tablica zawiera typy non-Pod, ale wciąż jest to wykonalne.

+0

Dzięki - to użyteczne i prawie to, co zrezygnowałem. Tak jak mówisz, brakuje tego wsparcia nie-POD, a być może wpisujesz sprawdzanie/wymuszanie (na przykład konwertowanie wariantu podwójnego na wektor int). –

Powiązane problemy