【问题标题】:any_cast std::any pointer to specific pointer typeany_cast std::any 指向特定指针类型的指针
【发布时间】:2019-12-17 04:12:04
【问题描述】:

我希望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&lt;string, any&gt;* 而是其他东西,它也不会表示演员阵容错误,但如果它仍然有效。

我做得对吗?

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 类型的指针。

什么???

【问题讨论】:

    标签: c++ pointers casting any


    【解决方案1】:

    就像dynamic_castany_cast一样,指针在失败时返回空指针——它不会抛出异常。

    【讨论】:

      【解决方案2】:

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

      documentation of std::any(重载 n.5)中所报告:

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

      所以实际上你只需检查指针就可以检查演员是否成功。

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

      【讨论】:

        【解决方案3】:

        尝试运行此代码

        #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

        所以非法转换返回了一个空指针。编译器无法检测到无效转换

        【讨论】:

          猜你喜欢
          • 2019-12-17
          • 2016-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-14
          • 2015-04-06
          • 1970-01-01
          • 2011-12-29
          相关资源
          最近更新 更多