any_cast std::any 指向特定指针类型的指针
any_cast std::any pointer to specific pointer type
我希望 std::map<string, any> *var1
指向与 std::any *var2
相同的内存 address/value 因为我知道 var2
指向 map<string, any>
。
以下似乎有效:
std::map<string, any> *var1 = any_cast<std::map<string, any>>(var2);
可以吗?问题是即使 var2
实际上不是 std::map<string, any>*
而是其他东西,它也不会发出错误的信号,但如果它是它仍然有效。
我做的对吗?
std::map<string, any> *mapptr;
std::any realmap = std::map<string, any>({{"key", "value"}, {"key2", 5}});
std::any *ptrtomap = &realmap;
mapptr = any_cast<std::map<string, any>>(ptrtomap);
// Interesting part below
realmap = 6;
mapptr = any_cast<std::map<string, any>>(ptrtomap);
将变量的类型更改为整数后,any 指针指向我仍然可以将该指针转换为 std::map
.
类型的指针
什么???
试试运行这个代码
#include <stdio.h>
#include <map>
#include <string>
#include <any>
using namespace std;
int main()
{
map<string, any> *amap;
any realmap = std::map<string, any>({{"key", "value"}, {"key2", 5}});
any *ptrtomap = &realmap;
amap = any_cast<map<string, any>>(ptrtomap);
printf("Pointer real map: %x\n", amap);
// Interesting part below
realmap = 6;
amap = any_cast<map<string, any>>(ptrtomap);
printf("Pointer invalid map: %x\n", amap);
return 0;
}
它输出例如
Pointer real map: 11cfd00
Pointer invalid map: 0
所以非法转换返回了一个空指针。编译器无法检测到无效的转换
The problem is that it does not signal bad cast even if var2 is actually not an std::map* but something else
如 documentation of std::any(超载 n.5)中所述:
If operand is not a null pointer, and the typeid of the requested T matches that of the contents of operand, a pointer to the value contained by operand, otherwise a null pointer.
所以实际上你可以通过检查指针来检查转换是否成功。
mapptr = std::any_cast<std::map<string, any>>(&realmap);
if (!mapptr) {
// invalid cast conversion
}
就像 dynamic_cast
一样,any_cast
ing 一个指针 returns 失败时的空指针 - 它不会抛出异常。
我希望 std::map<string, any> *var1
指向与 std::any *var2
相同的内存 address/value 因为我知道 var2
指向 map<string, any>
。
以下似乎有效:
std::map<string, any> *var1 = any_cast<std::map<string, any>>(var2);
可以吗?问题是即使 var2
实际上不是 std::map<string, any>*
而是其他东西,它也不会发出错误的信号,但如果它是它仍然有效。
我做的对吗?
std::map<string, any> *mapptr;
std::any realmap = std::map<string, any>({{"key", "value"}, {"key2", 5}});
std::any *ptrtomap = &realmap;
mapptr = any_cast<std::map<string, any>>(ptrtomap);
// Interesting part below
realmap = 6;
mapptr = any_cast<std::map<string, any>>(ptrtomap);
将变量的类型更改为整数后,any 指针指向我仍然可以将该指针转换为 std::map
.
什么???
试试运行这个代码
#include <stdio.h>
#include <map>
#include <string>
#include <any>
using namespace std;
int main()
{
map<string, any> *amap;
any realmap = std::map<string, any>({{"key", "value"}, {"key2", 5}});
any *ptrtomap = &realmap;
amap = any_cast<map<string, any>>(ptrtomap);
printf("Pointer real map: %x\n", amap);
// Interesting part below
realmap = 6;
amap = any_cast<map<string, any>>(ptrtomap);
printf("Pointer invalid map: %x\n", amap);
return 0;
}
它输出例如
Pointer real map: 11cfd00
Pointer invalid map: 0
所以非法转换返回了一个空指针。编译器无法检测到无效的转换
The problem is that it does not signal bad cast even if var2 is actually not an std::map* but something else
如 documentation of std::any(超载 n.5)中所述:
If operand is not a null pointer, and the typeid of the requested T matches that of the contents of operand, a pointer to the value contained by operand, otherwise a null pointer.
所以实际上你可以通过检查指针来检查转换是否成功。
mapptr = std::any_cast<std::map<string, any>>(&realmap);
if (!mapptr) {
// invalid cast conversion
}
就像 dynamic_cast
一样,any_cast
ing 一个指针 returns 失败时的空指针 - 它不会抛出异常。