无法修改引擎时,如何调用Mesh类私有VertexLoop类型的findBoundaryLoops?
解决Mesh类私有VertexLoop结构体的调用问题
可行方案
1. 模板推导间接处理(推荐,安全合法)
利用C++模板的类型推导特性,无需显式声明私有类型VertexLoop,通过包装函数让编译器自动匹配类型,直接通过forEachNode回调处理节点数据:
#include <vector> template<typename NodeCallback> void processMeshBoundaries(const Mesh& mesh, memory::MemoryArena& arena, NodeCallback&& nodeCallback) { // 内部lambda负责调用findBoundaryLoops并遍历循环 auto processLoops = [&](auto& loops) { mesh.findBoundaryLoops(arena, loops); for (auto& loop : loops) { loop.forEachNode(nodeCallback); } }; // 让编译器根据processLoops的参数要求,自动推导vector的元素类型 using LoopType = typename std::decay_t<decltype(processLoops)>::template argument_type<0>::value_type; std::vector<LoopType> loops; processLoops(loops); } // 使用示例 int main() { Mesh myMesh; memory::MemoryArena myArena; processMeshBoundaries(myMesh, myArena, [](Mesh::VertexNode* node) { // 在这里处理每个边界节点 const Vertex& vertex = node->vertex; float angle = node->angle; // 你的业务逻辑,比如输出顶点坐标、计算边界长度等 }); return 0; }
这个方案完全符合C++标准,无需依赖未定义行为,兼容性好。
2. 内存布局匹配(不推荐,不安全)
如果受限于C++版本无法使用模板推导,可以尝试声明一个与VertexLoop内存布局完全一致的公共结构体,通过类型转换绕过访问限制。但这属于未定义行为,引擎结构变更会直接导致崩溃:
// 必须保证成员顺序、大小、对齐与Mesh::VertexLoop完全一致 struct PublicVertexLoop { void* firstNode; // 用void*替代私有VertexNode* uint32_t nodeCount; }; void processBoundaries(const Mesh& mesh, memory::MemoryArena& arena) { std::vector<PublicVertexLoop> publicLoops; // 强制转换vector类型 auto& privateLoops = reinterpret_cast<std::vector<Mesh::VertexLoop>&>(publicLoops); mesh.findBoundaryLoops(arena, privateLoops); // 遍历处理每个循环 for (auto& loop : publicLoops) { auto node = reinterpret_cast<Mesh::VertexNode*>(loop.firstNode); for (uint32_t i = 0; i < loop.nodeCount; ++i) { // 处理节点数据 node = node->next; } } }
仅在极端情况下临时使用,不建议作为长期解决方案。
3. 请求引擎开发者修改(最稳妥)
联系引擎维护者,请求将VertexLoop改为公有,或者提供一套公共API来访问边界循环数据。这是最可靠的方案,从根源上解决问题,避免任何潜在风险。
内容的提问来源于stack exchange,提问作者Zoltán Orosz
相关产品推荐
相关产品推荐

