C++ any_cast std::指向特定指针类型的任何指针

C++ any_cast std::指向特定指针类型的任何指针,c++,pointers,casting,any,C++,Pointers,Casting,Any,我希望std::map*var1指向与std::any*var2相同的内存地址/值,因为我知道var2指向的是map 以下似乎有效: std::map<string, any> *var1 = any_cast<std::map<string, any>>(var2); 将变量类型更改为整数后,任何指针指向的指针仍然可以将该指针转换为std::map类型的指针 什么?尝试运行此代码 #include <stdio.h> #include <

我希望
std::map*var1
指向与
std::any*var2
相同的内存地址/值,因为我知道
var2
指向的是
map

以下似乎有效:

std::map<string, any> *var1 = any_cast<std::map<string, any>>(var2);
将变量类型更改为整数后,任何指针指向的指针仍然可以将该指针转换为
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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
地图*amap;
任何realmap=std::map({{“key”,“value”},{“key2”,5});
任意*ptrtomap=&realmap;
amap=任何投影(ptrtomap);
printf(“指针实际映射:%x\n”,amap);
//下面有趣的部分
realmap=6;
amap=任何投影(ptrtomap);
printf(“指针无效映射:%x\n”,amap);
返回0;
}
它输出例如

指针真实映射:11cfd00
指针无效映射:0

因此,非法转换返回空指针。编译器无法检测无效的强制转换

请尝试运行此代码

#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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
地图*amap;
任何realmap=std::map({{“key”,“value”},{“key2”,5});
任意*ptrtomap=&realmap;
amap=任何投影(ptrtomap);
printf(“指针实际映射:%x\n”,amap);
//下面有趣的部分
realmap=6;
amap=任何投影(ptrtomap);
printf(“指针无效映射:%x\n”,amap);
返回0;
}
它输出例如

指针真实映射:11cfd00
指针无效映射:0

因此,非法转换返回空指针。编译器无法检测无效的强制转换

问题是,即使var2实际上不是std::map*而是其他东西,它也不会发出坏的cast信号

如(过载n.5)中所述:

如果操作数不是空指针,并且请求的T的typeid与操作数内容的typeid匹配,则为指向操作数包含的值的指针,否则为空指针

因此,实际上,只要检查指针,就可以检查强制转换是否成功

mapptr = std::any_cast<std::map<string, any>>(&realmap);
if (!mapptr) {
  // invalid cast conversion
}
mapptr=std::any_cast(&realmap);
如果(!mapptr){
//无效的强制转换
}
问题是,即使var2实际上不是std::map*而是其他东西,它也不会发出坏的cast信号

如(过载n.5)中所述:

如果操作数不是空指针,并且请求的T的typeid与操作数内容的typeid匹配,则为指向操作数包含的值的指针,否则为空指针

因此,实际上,只要检查指针,就可以检查强制转换是否成功

mapptr = std::any_cast<std::map<string, any>>(&realmap);
if (!mapptr) {
  // invalid cast conversion
}
mapptr=std::any_cast(&realmap);
如果(!mapptr){
//无效的强制转换
}

就像
动态投射
任何投射
在指针失败时返回空指针-它不会引发异常。

就像
动态投射
任何投射
在指针失败时返回空指针-它不会引发异常