any_cast std :: any指向特定指针类型的指针

时间:2019-08-09 12:05:08

标签: c++ pointers casting any

我希望std::map<string, any> *var1指向与std::any *var2相同的内存地址/值,因为我知道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);

将变量的类型更改为整数后,任何指向的指针,我仍然可以将该指针转换为std::map类型的指针。

什么?

3 个答案:

答案 0 :(得分:2)

尝试运行此代码

#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;
}

它输出例如

  

指针真实地图:11cfd00
  指针无效图:0

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

答案 1 :(得分:2)

  

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

documentation of std::any(过载n.5)中所述:

  

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

实际上,您只需检查指针就可以检查演员表的成功。

mapptr = std::any_cast<std::map<string, any>>(&realmap);
if (!mapptr) {
  // invalid cast conversion
}

答案 2 :(得分:1)

就像dynamic_cast一样,any_cast指向指针在失败时会返回空指针-它不会引发异常。