C++中如何简化仅结构体成员变量不同的相似函数实现?
问题描述
定义了如下枚举类和结构体:
enum class ETerrainType : uint16_t {/*Enum types here*/}; enum class EBuildingType : uint16_t {/*Enum types here*/}; enum class EDecorationType : uint16_t {/*Enum types here*/}; struct Tile { ETerrainType TerrainType; EBuildingType BuildingType; EDecorationType DecorationType; };
注意:该结构体的所有成员变量均具有相同的底层类型(uint16_t)。
现有一个Tile容器std::vector<Tile> Tiles;,并为每个成员变量编写了重复的循环函数:
void TerrainTypeFunc() { for (Tile& tile : Tiles) { DoSomething(static_cast<uint16_t>(tile.TerrainType)); } } void BuildingTypeFunc() { for (Tile& tile : Tiles) { DoSomething(static_cast<uint16_t>(tile.BuildingType)); } } void DecorationTypeFunc() { for (Tile& tile : Tiles) { DoSomething(static_cast<uint16_t>(tile.DecorationType)); } }
认为仅因访问成员不同就重复定义函数属于不良实践,同时排除了以下方案:
- 将成员存储为
uint16_t数组:无法利用结构体打包优化,且可读性差 - 通过内存偏移访问成员:依赖内存对齐,属于不良实践且可读性差
- 运行时分支判断:会产生额外运行时开销
需求:如何用更少的代码定义这三个函数,且不产生额外运行时开销?优先考虑模板实现,其次考虑宏实现。
解决方案
模板实现(推荐)
利用编译期成员指针作为模板参数,可以在不损失性能的前提下实现代码复用,同时保持类型安全。编译器会为每个模板实例生成独立的代码,效果与手写三个函数完全一致,无任何运行时开销。
代码示例:
// 通用模板函数,模板参数为Tile的成员指针 template <auto MemberPtr> void ProcessTileMember() { for (Tile& tile : Tiles) { auto& targetMember = tile.*MemberPtr; DoSomething(static_cast<uint16_t>(targetMember)); } } // 实例化三个具体函数 void TerrainTypeFunc() { ProcessTileMember<&Tile::TerrainType>(); } void BuildingTypeFunc() { ProcessTileMember<&Tile::BuildingType>(); } void DecorationTypeFunc() { ProcessTileMember<&Tile::DecorationType>(); }
宏实现(备选)
宏可以在预处理阶段展开为重复代码,同样不会产生运行时开销,但缺乏类型检查,使用时需确保成员名称正确。
代码示例:
// 定义宏用于生成处理函数 #define DEFINE_TILE_PROCESS_FUNC(FUNC_NAME, MEMBER_NAME) \ void FUNC_NAME() \ { \ for (Tile& tile : Tiles) \ { \ DoSomething(static_cast<uint16_t>(tile.MEMBER_NAME)); \ } \ } // 生成三个目标函数 DEFINE_TILE_PROCESS_FUNC(TerrainTypeFunc, TerrainType) DEFINE_TILE_PROCESS_FUNC(BuildingTypeFunc, BuildingType) DEFINE_TILE_PROCESS_FUNC(DecorationTypeFunc, DecorationType)
内容的提问来源于stack exchange,提问作者0liveradam8
相关产品推荐
相关产品推荐

