当期望std::vector<A*>时,能否直接传递std::vector<void*>&给Get函数?
问题解答
首先直接给结论:不行,你没办法直接把std::vector<void*>传递给Get函数(不修改/重载Get的前提下),原因和替代方案我给你详细说清楚:
为什么直接传不行?
Get函数的参数是std::vector<A*>&,它明确要求接收一个std::vector<A*>的引用。而你手里的vecvoid是std::vector<void*>——这两个是C++模板实例化出来的完全独立的类,它们之间没有任何继承关系,也不存在合法的隐式转换。编译器会直接抛出类型不匹配的错误,根本不会让代码通过编译。
那有没有“歪门邪道”能绕过?
有人可能会想到用reinterpret_cast强制转换类型,比如写这样的代码:
auto vecvoid = std::vector<void*>(); Get(reinterpret_cast<std::vector<A*>&>(vecvoid));
但我必须严肃提醒你:这是未定义行为!虽然在某些特定编译器和平台上,std::vector<A*>和std::vector<void*>的内存布局可能碰巧一致,但C++标准完全不保证这一点。这么做可能会导致程序崩溃、内存损坏,或者在不同环境下出现完全不可预测的bug,绝对不能在生产代码里这么玩。
安全的替代方案
既然不能修改Get,最稳妥的方式还是保留你原来的两步操作:先调用Get填充std::vector<A*>,再把元素复制到std::vector<void*>里。
如果你觉得每次写两步麻烦,可以封装一个简单的包装函数,把逻辑藏起来:
void GetIntoVoidVector(std::vector<void*>& target) { std::vector<A*> temp_vec; Get(temp_vec); target.assign(temp_vec.begin(), temp_vec.end()); }
之后直接调用这个包装函数就可以了,既安全又简洁。
内容的提问来源于stack exchange,提问作者CinCout
相关产品推荐
相关产品推荐

