2010-03-01 7 views
6

¿Hay alguna fácil de usar, clases de alto nivel o bibliotecas que le permiten interactuar con VARIANT s en Visual C++?Una manera simple de convertir a/de tipos de variantes en C++

Más específicamente, me gustaría para convertir entre tipos de POD (por ejemplo double, long), cadenas (por ejemplo CString), y los contenedores (por ejemplo std::vector) y VARIANT s. Por ejemplo:

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 (? Ingenuamente) supone que las personas que trabajan con COM hacen esto todo el tiempo, por lo que sería más probable es que sea una sola biblioteca convenienteque se encarga de todo tipo de conversiones. Pero todo lo que he podido encontrar es un variado surtido de clases contenedoras que convierten cada unos tipos:

¿hay alguna forma sencilla - corto de cambiar a Visual Basic - para evitar esta pesadilla de gestionar la memoria incómoda y código bit a bit VT_ARRAY | VT_I4?

preguntas relacionadas:

+0

La pregunta realmente no se aplica a [C++] (que no tiene esa construcción), solo el dialecto visual. – dmckee

+0

@dmckee: es cierto. –

+0

Para cualquier persona que sienta curiosidad por lo que POD significa aquí, hay una respuesta de desbordamiento de pila. http://stackoverflow.com/questions/146452/what-are-pod-types-in-c –

Respuesta

4

Bueno, la mayor parte del trabajo duro ya está hecho para usted con las diversas clases de envoltura. Prefiero _variant_t y _bstr_t ya que son más adecuados para la conversión a/desde tipos y cadenas de POD. Para arreglos simples, todo lo que realmente necesita es la función de conversión de plantilla. Algo así como lo siguiente:

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

por supuesto las cosas se ponen peludas (en lo que respecta a la gestión de memoria/vida) si la matriz contiene los tipos no-POD, pero todavía es factible.

+0

Gracias - eso es útil, y más o menos a lo que me he resignado a hacer. Como dices, lo que falta es soporte no POD, y tal vez verificación/coerción de tipo (por ejemplo, convertir una variante de dobles en un vector de entradas). –

Cuestiones relacionadas