Описание тега variant
In ocaml, the variant type is a basic building block of the language. Custom variants are defined with a set of constructors that restrict which types it can hold, and are used to inspect it in pattern-matching and to warn if a pattern match does not cover all constructors.
Questions that should have this tag would include ones involving how to pass data between Windows processes or within the same process using ole and classic com function calls. Often the calls occur between languages (e.g. vb6 to c++), but they are also used in single language programs (e.g. c++) to achieve a plug-in, modular architecture with DLL files.
A variant is technically a structure holding a union of data types along with a VARTYPE
that indicates which member of the structure is valid. It can hold any other data type, including primitive types (BYTE
, LONG
), pointers to primitive types (LONG*
, FLOAT*
), IDispatch
pointers, and even pointers to other variants.
There are a couple of helper classes Microsoft has created to help with the details of dealing with raw variants:
These classes relieve much of the grunt work of interop programming with variants such as doing deep destroys on contained SAFEARRAY
s.
Definitions
- Tagged union: A data structure that can be used to hold a number of different data types, only one of which is valid at a time. There is a field (
VARTYPE
) which indicates the valid data member ( https://en.wikipedia.org/wiki/Tagged_union)
Examples
OCaml
(* Definition of the built-in option type *)
type 'a option =
| Some of 'a
| None
(* Construction *)
let var = Some "hello"
(* Inspection through pattern matching *)
let greeting =
match var with
| Some str -> str
| None -> "howdy"
Visual Basic
Dim var as Variant
var = "hello" 'Variant holds a string
var = 7 'Variant holds an Integer
C++
_variant_t var;
var = "hello"; //Variant holds a string
var = 7; //Variant holds an int