Pat*_*ick 6 c c++ casting void-pointers
我继承了一个最初用C编写的大应用程序(但同时也添加了很多C++).由于历史原因,该应用程序包含许多void指针.在你开始窒息之前,让我解释为什么这样做.
该应用程序包含许多不同的数据结构,但它们存储在"通用"容器中.现在我会使用模板化STL容器,或者我会给所有数据结构一个公共基类,这样容器可以存储指向基类的指针,但是在[好?]旧C天,唯一的解决方案是将struct-pointer强制转换为void-pointer.
另外,有很多代码可以在这些void指针上运行,并使用非常奇怪的C结构来模拟C中的多态性.
我正在重新编写应用程序,并试图摆脱虚空指针.为所有数据结构添加一个公共基类并不困难(几天的工作),但问题是代码充满了如下所示的结构.
这是数据存储方式的示例:
void storeData (int datatype, void *data); // function prototype
...
Customer *myCustomer = ...;
storeData (TYPE_CUSTOMER, myCustomer);
Run Code Online (Sandbox Code Playgroud)
这是再次获取数据的示例:
Customer *myCustomer = (Customer *) fetchData (TYPE_CUSTOMER, key);
Run Code Online (Sandbox Code Playgroud)
我实际上想用一些智能指针(引用计数)替换所有的void指针,但我找不到一个自动化(或至少)帮助我摆脱所有转换的技巧 - 指针.
有关如何以这些转换的任何可能方式查找,替换或互动的任何提示?
我实际上想用一些智能指针(引用计数)替换所有的void指针,但我找不到一个自动化(或至少)帮助我摆脱所有转换的技巧 - 指针.
这种自动重构具有很多风险.
否则,有时我喜欢通过制作模板函数的void*函数来玩弄技巧.那:
void storeData (int datatype, void *data);
Run Code Online (Sandbox Code Playgroud)
变为:
template <class T>
void storeData (int datatype, T *data);
Run Code Online (Sandbox Code Playgroud)
首先通过简单地包装原始(重命名)函数并转换类型来实现模板.这可能会让您看到潜在的问题 - 只需编译代码即可.