一、简介
std::any 可以储存任何可拷贝构造和可销毁的类型的对象。
struct test
{
test(int a,int b){}
};
int main(int argc, char *argv[])
{
std::any a = 1;
qDebug() << a.type().name();
a = 3.14;
qDebug() << a.type().name();
a = true;
qDebug() << a.type().name();
a = test(1,2);
qDebug() << a.type().name();
}
QObject 类型是不可拷贝的,直接将此类对象赋给 std::any 就会报错:
要把 QObject 赋给 std::any 应该赋指针:
二、相关函数
1、std::any_cast
int main(int argc, char *argv[])
{
std::any storage = 3.14;
double d = std::any_cast<double>(storage);
qDebug() << d;
double* ptr = std::any_cast<double>(&storage);
if (ptr)
{
qDebug() << *ptr;
}
}
要注意如果类型不匹配会抛出 std::bad_any_cast 异常。
2、std::make_any
这是两种方式:
std::any val = std::make_any<int>(23);
std::any val = 23;
二者的区别:
std::make_any<int>(23)
:使用std::make_any
函数并指定模板参数为int
,通过调用int
类型的构造函数创建一个临时的int
对象,然后将该对象存储在 std::any 中。std::any val = 23
:直接将整数值 23 赋给 std::any 变量val
,此时编译器会自动推导出 std::any 对象的类型,并调用相应的构造函数来存储该值。
两者的区别在于对象的构造方式。使用 std::make_any
可以显式指定对象的类型,并通过调用构造函数来创建对象。
3、std::any::emplace
int main(int argc, char *argv[])
{
std::any storage1 = 2.2;
storage1 = 23;
qDebug()<<storage1.type().name(); //int
std::any storage2 = 2.2;
storage2.emplace<qint8>(23);
qDebug()<<storage2.type().name(); //signed char
}
4、std::any::has_value
int main(int argc, char *argv[])
{
std::any storage;
qDebug() << storage.has_value(); // false
storage = 42;
qDebug() << storage.has_value() ; // true
}
5、std::any::reset
int main(int argc, char *argv[])
{
std::any storage = 42;
qDebug() << storage.has_value(); // true
storage.reset();
qDebug() << storage.has_value(); // false
}