Variant в языке C++ - универсальный тип, который может принимать значения разных типов данных. Сам тип данных может иметь и немного другое название. Применяется, например, при работе с OLE. Например, когда нужно связаться с Excel. В качестве примера, рассмотрим variant - шаблон библиотеки boost, позволяющий работу с любым типом данных.
Чтобы использовать его в программе, нужно вызвать библиотеку boost/variant и уже после этого начинать работу. Иногда, в зависимости от того какой у Вас компилятор, может понадобиться предварительно установить библиотеку boost. Простейший пример работы этого шаблона выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <boost/variant.hpp> #include <string> int main() { boost::variant<int, char, std::string> a; a = 3; a = 'S'; a = "Stroka"; return 0; } |
При создании переменной a типа variant необходимо задать множество типов, поддерживаемое этой переменной. Введенные int, char, string устанавливают, что переменной можно присвоить значение этих типов, то есть число, символ или строку. Количество задаваемых типов неограниченно, единственное ограничение – они должны быть заранее известны компилятору. Вернемся к примеру. После объявления переменной мы 3 раза присваиваем ей значения разных типов. Каждый раз, вводя новое значение в переменную, мы перезаписываем ее, после всех операций переменная a имеет значение "Stroka" типа string.
Работа с данным шаблоном должна быть аккуратной – из-за частой смены типов могут возникнуть ошибки при присвоении variant-переменной переменным определенных типов. Существует безопасный способ работы с variant, заключающийся в использовании функции boost::apply_visitor(). Это некое подобие перегрузки функции, позволяющее безопасно извлекать из variant нужные типы. Пример этой конструкции выглядит так:
1 2 3 4 |
struct output : public boost::static_visitor<> { void operator()(double d) const { std::cout << d << '\n'; } }; |
После создания структуры достаточно вызвать функцию:
1 |
boost::apply_visitor(output{}, v); |
и в случае совпадения типа с типом в конструкции, будет выполнен вызов участка кода, в данном случае вывода на экран числа.