Класс any
Класс any из заголовка <any> представляет собой
контейнер, способный хранить значение любого типа. Он позволяет
сохранять данные произвольного типа и извлекать их с проверкой
типа во время выполнения. Класс any полезен в ситуациях,
когда тип данных заранее неизвестен или может изменяться.
При создании объекта any можно передать значение любого
копируемого типа, а для извлечения используется функция
any_cast.
Синтаксис
#include <any>
any a; // пустой any
any a(value); // any со значением
any a(other); // копирование
a = value; // присваивание значения
a = other; // присваивание другого any
a.has_value(); // проверка наличия значения
a.reset(); // очистка значения
a.type(); // получение type_info
any_cast<T>(a); // извлечение значения типа T
Пример
Давайте создадим объект any с целым числом и извлечем
значение с помощью any_cast:
#include <iostream>
#include <any>
using namespace std;
int main()
{
any a = 42;
cout << any_cast<int>(a) << endl;
return 0;
}
Результат выполнения кода:
42
Пример
Давайте сохраним строку в any и проверим тип:
#include <iostream>
#include <any>
#include <string>
using namespace std;
int main()
{
any a = string("abcde");
cout << a.has_value() << endl;
cout << (a.type() == typeid(string)) << endl;
cout << any_cast<string>(a) << endl;
return 0;
}
Результат выполнения кода:
1
1
"abcde"
Пример
Давайте создадим пустой any, присвоим значение, а затем
сбросим его:
#include <iostream>
#include <any>
using namespace std;
int main()
{
any a;
cout << a.has_value() << endl;
a = 3.14;
cout << a.has_value() << endl;
cout << any_cast<double>(a) << endl;
a.reset();
cout << a.has_value() << endl;
return 0;
}
Результат выполнения кода:
0
1
3.14
0
Пример
Давайте изменим тип хранимого значения с int на
string и обработаем неверное извлечение:
#include <iostream>
#include <any>
#include <string>
using namespace std;
int main()
{
any a = 12345;
try
{
cout << any_cast<string>(a) << endl;
}
catch (const bad_any_cast& e)
{
cout << "bad_any_cast" << endl;
}
a = string("abcde");
cout << any_cast<string>(a) << endl;
return 0;
}
Результат выполнения кода:
"bad_any_cast"
"abcde"