# Tipo variante

En ciencias de la computación variante es un tipo de dato utilizados por ciertos lenguajes de programación, particularmente en Visual Basic, OCaml, y C++ cuando se usa el Component Object Model.

## Información

En Visual Basic (y Visual Basic para Aplicaciones) el tipo de dato variante es una unión etiquetada que puede ser usada para representar todos los otros tipos de datos (por ejemplo, Entero, Flotante, Doble, Etc.) excepto con tipos cadena de longitud fija y tipos de datos Record. En Visual Basic toda variable no declarada explícitamente o cuyo tipo no es declarado explícitamente, es tomado como una variante.
Si bien no se recomienda el uso de variantes no declarados explícitamente, pueden ser de utilidad cuando el tipo de datos necesarios sólo puede ser conocido en tiempo de ejecución, cuando se espera que el tipo de datos puedan variar, o cuando se desean parámetros opcionales y matrices de parámetros. De hecho, los lenguajes con un sistema de tipo dinámico a menudo tienen variante como el único tipo de dato disponible para variables.
Aunque notoriamente carente de eficiencia, las variantes se usan comúnmente como parámetros para objetos COM debido a su flexibilidad. Usted puede pensar en una variante como una especie de contenedor, que puede contener una variable de cualquier tipo de datos, numéricos, de cadena, o incluso todo un arsenal. Esto simplifica el proceso de llamar a procedimientos en un COM Object Server, ya que hay poca necesidad de preocuparse por la gran cantidad de tipos de datos posibles para cada parámetro.

## Formato

Una variable de tipo variante, llamada "Variant" en inglés como se denomina en Visual Basic, necesita 16 bytes de almacenamiento y su distribución es la siguiente.
| Nombre | Offset | Tamaño | Descripción |
| iType | 0 | 2 | El valor retornado por VarType; especifica qué tipo de datos contiene la variante. |
| reserved | 2 | 6 | Bytes reservados; debe ser cero. |
| lLen | 8 | Arriba de 8 | Puntero a la dirección que contiene los datos. |

## Tipos

Unos pocos ejemplos de variantes que uno puede encontrar en el seguimiento de Visual Basic, En otros idiomas otros tipos de variantes se pueden utilizar también.
| Tipo de variable | Bytes de datos | Tipos C/C++ | Nombre de tipo |
| 0 | | | Empty$^1$ |
| 1 | | | Null$^2$ |
| 10 | 2A000A80 | HRESULT (long int) | Error |
| 10 | 80020004 | HRESULT (long int) | Missing$^3$ |
| 17 | 2A | BYTE (unsigned char) | Byte |
| 11 | FFFF | VARIANT_BOOL (short int) | Boolean |
| 2 | 2A00 | short int | Integer |
| 3 | 2A000000 | long int | Long |
| 4 | 00002842 | float | Single |
| 5 | 0000000000004540 | double | Double |
| 6 | A068060000000000 | CY structure | Currency |
| 7 | 00000000C0D5E140 | DATE (double) | Date |
| 8 | xxxxxxxx | BSTR (wchar_t pointer) | String |
| 9 | 00000000 | IUnknown pointer | Nothing$^4$ |
| 9 | xxxxxxxx | IUnknown pointer | Object reference$^5$ |

## Tipo variante en distintos lenguajes
### Visual Basic

En el lenguaje Visual Basic el tipo de dato variante es manejado internamente por el compilador, por lo que no es necesario insertar los datos correspondientes (y requeridos) en el tipo de dato variante, tampoco es necesario declarar explícitamente el tipo de dato en el que se trabajará.

### Pauscal

En el lenguaje de programación Pauscal el tipo de dato variante solo puede ser utilizado de forma explícita, a diferencia de Visual Basic el compilador de Pauscal no hace "el trabajo sucio" por el programador, por lo que es necesario trabajarlo.

### Delphi

En Delphi una variable de tipo variante se declara de la siguiente manera: