【问题标题】:Cast map structure to void pointer and dereference将映射结构转换为 void 指针和取消引用
【发布时间】:2015-08-04 05:29:23
【问题描述】:

我一直在尝试将映射结构转换为 void 指针,反之亦然。

void addToMap(void *data){
// add some elements to the map
}

map<string, vector<myStruct> > myMap;
addToMap(&myMap);

我正在尝试将 myMap 作为参数发送到 addToMap 函数,并在函数内添加一些元素。我怎样才能将 void 参数推迟到地图结构?

我知道 static_cast 可用于取消引用 void 类型以了解类型。例如:

int* a = new int();
void* b = static_cast<void*>(a);
int* c = static_cast<int*>(b);

上面的 sn-p 可以工作,但我想在这种情况下不行。我已经为我的情况尝试过,也许必须有另一个技巧。

【问题讨论】:

  • 这不是 C,也许是 C++?
  • 我正在用 C++ 构建一个项目,但是我使用了一些 C 库,而接受 void 参数的函数来自这些库。
  • 你不能简单地将它转换回你的地图类型吗?
  • 请使用您正在书写的语言的标签(问题的实际语言和答案应该被写出来)。您可能碰巧使用的任何库的语言可能在很大程度上无关紧要。另外,请扩展“将不起作用”。是编译器错误,还是运行时错误,是否正在发射导弹?

标签: c++ dictionary casting void-pointers dereference


【解决方案1】:

在 addToMap 函数中,您可以将 void 指针转换回原始类型:

void addToMap(void *data){
    auto pmap = static_cast<map<string, vector<myStruct> >*>(data);
    pmap->insert(...);
}

static_cast 还能够执行所有隐式允许的转换 (不仅是那些指向类的指针),而且还能够执行 与这些相反。它可以:

从 void* 转换为任何指针类型。在这种情况下,它保证如果 void* 值是通过从 同样的指针类型,得到的指针值也是一样的。

【讨论】:

  • 错误:“pmap”没有命名类型。尝试在 Ubuntu 上使用 Eclipse 进行编译。
  • @serhatg 此代码有效。你用的是哪个编译器?
  • @Quentin 以前我使用过 Cross g++,我只是在 GNU g++ 4.6.3 上尝试过。同样的错误不会发生。
  • @serhatg 您应该提到您在问题中使用的是 C++03 编译器。用指针的显式类型替换auto :)
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 2015-01-04
  • 2019-05-23
  • 2016-11-10
  • 2014-01-13
相关资源
最近更新 更多