You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

当期望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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:12:19