2010-03-01 6 views
6

Y at-il facile à utiliser, classes de haut niveau ou les bibliothèques qui vous permettent d'interagir avec VARIANT s dans Visual C++?Une façon simple de convertir en/de types Variant en C++

Plus précisément, je voudrais convertir les types de POD (par exemple double, long), les chaînes (par exemple CString), et les conteneurs (par exemple std::vector) et VARIANT s. Par exemple:

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 (? Naïvement) suppose que les gens qui travaillent avec COM font cela tout le temps, donc il y aurait très probablement une bibliothèque pratique unique qui gère toutes sortes de conversions. Mais tout ce que je suis en mesure de trouver est un assortiment hétéroclite de classes d'emballage qui convertissent chacun quelques types:

est-il un moyen simple - peu de passer à Visual Basic - pour éviter ce cauchemar de la mémoire maladroite gÉRER ment et bit VT_ARRAY | VT_I4?

questions connexes:

+0

La question ne s'applique pas vraiment à [C++] (qui n'a pas cette construction), juste le dialecte visuel. – dmckee

+0

@dmckee: vous avez raison. –

+0

Pour quiconque est curieux ce que POD signifie ici est une réponse de dépassement de pile. http://stackoverflow.com/questions/146452/what-are-pod-types-in-c –

Répondre

4

Eh bien, la plupart du travail est déjà fait pour vous avec les différentes classes d'emballage. Je préfère _variant_t et _bstr_t, car ils sont plus adaptés à la conversion vers/depuis les types et chaînes de POD. Pour les tableaux simples, tout ce dont vous avez vraiment besoin est la fonction de conversion de modèle. Quelque chose comme ce qui suit:

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

des choses bien sûr obtenir poilue (en ce qui concerne la mémoire/gestion de la vie) si le tableau contient des types non-POD, mais il est toujours faisable.

+0

Merci - c'est utile, et à peu près tout ce que je me suis résigné à faire. Comme vous le dites, ce qui manque est le support non-POD, et peut-être le contrôle de type/coercition (par exemple convertir une variante de double en un vecteur d'ints). –

Questions connexes