基于类型特征的泛型Lambda适配非Object3D派生类问题
嗨,这个问题刚好可以用C++的类型特征(type traits)配合编译期分支完美解决——本质上就是让你的Lambda在编译时自动识别对象类型,分别走对应的处理逻辑,不用动原来的核心代码,还能无缝兼容新类型。
我给你拆解下具体的实现步骤:
第一步:准备编译期类型判断工具
我们需要一个能在编译时检测类型是否派生自Object3D的工具,直接用标准库的std::is_base_of_v就可以,包装一下让代码更清晰:
#include <type_traits> // 编译期常量:判断T是否是Object3D的派生类(自动处理引用、const等修饰符) template<typename T> constexpr bool IsObject3DDerived = std::is_base_of_v<Object3D, std::decay_t<T>>;
第二步:用if constexpr改造Lambda(C++17及以上推荐)
C++17引入的if constexpr可以在编译时就确定执行哪个分支,完全没有运行时开销。修改后的Lambda会自动区分两种类型,分别处理:
auto update = [&](auto& container, shader& effect) { for (const auto& key : objects) { auto& obj = *container[key]; // 编译期判断:如果是Object3D派生类,走原来的逻辑 if constexpr (IsObject3DDerived<decltype(obj)>) { if (obj.HasAnyGeometry()) { m_GeometryDrawCalls.push_back({ &obj, effect }); } } // 处理新的非Object3D派生类,替换成你实际的判断逻辑 else { // 举个例子:假设新类型有IsDrawable()方法判断是否可绘制 if (obj.IsDrawable()) { m_GeometryDrawCalls.push_back({ &obj, effect }); } } } };
如果你的新类型不止一种,还可以继续加else if constexpr分支,比如针对特定类型做专属处理:
else if constexpr (std::is_same_v<std::decay_t<decltype(obj)>, NewSpecialType>) { // 这里写NewSpecialType的专属判断逻辑 if (obj.ShouldRender()) { m_GeometryDrawCalls.push_back({ &obj, effect }); } }
兼容C++11/14的方案:标签分发
如果你的编译器还不支持C++17,可以用标签分发的方式实现同样的效果,写两个重载的辅助函数:
// 辅助函数:处理Object3D派生类 template<typename T> typename std::enable_if_t<IsObject3DDerived<T>> addToDrawCalls(T& obj, shader& effect, decltype(m_GeometryDrawCalls)& drawCalls) { if (obj.HasAnyGeometry()) { drawCalls.push_back({ &obj, effect }); } } // 辅助函数:处理其他类型 template<typename T> typename std::enable_if_t<!IsObject3DDerived<T>> addToDrawCalls(T& obj, shader& effect, decltype(m_GeometryDrawCalls)& drawCalls) { if (obj.IsDrawable()) { // 替换成实际逻辑 drawCalls.push_back({ &obj, effect }); } }
然后在Lambda里调用这个辅助函数即可:
auto update = [&](auto& container, shader& effect) { for (const auto& key : objects) { auto& obj = *container[key]; addToDrawCalls(obj, effect, m_GeometryDrawCalls); } };
不管用哪种方案,核心都是编译期类型判断+分支处理,既保留了原有代码的逻辑,又能完美适配新的非Object3D派生类,而且完全没有运行时的额外开销。
内容的提问来源于stack exchange,提问作者mezo
相关产品推荐
相关产品推荐

