如何创建包含不同实例化Item类对象的Array模板类?
实现包含Item<1>到Item的Array类模板
要实现需求中Array<n>包含Item<1>至Item<n>对象的功能,核心思路是通过类模板全特化定义递归终止的空类,再配合主模板的递归结构完成成员组合。
1. 定义递归终止的特化版本
首先为Array<0>编写全特化代码,将其定义为空类,作为递归展开的终点:
template <> class Array<0> {};
2. 编写主模板的递归逻辑
主模板中包含当前序号的Item<n>对象,以及承载前n-1个Item的Array<n-1>对象,递归展开后自然会包含Item<1>到Item<n>的所有成员:
template <int n> class Array { public: Item<n> current_item; Array<n-1> prev_items; };
完整代码示例
结合你给出的Item类实现,完整代码如下:
// 定义Item类模板 template <int n> class Item { int numbers[n]; }; // 递归终止:Array<0>为空类 template <> class Array<0> {}; // 主模板递归定义 template <int n> class Array { public: Item<n> current_item; Array<n-1> prev_items; };
使用说明
当你实例化Array<3>时,其结构会展开为:
current_item:Item<3>对象prev_items:Array<2>对象,包含Item<2>和Array<1>Array<1>包含Item<1>和Array<0>(空类,无额外空间开销)
借助C++的空基类优化(EBO),Array<0>作为空成员不会占用额外内存,最终Array<n>的大小等于所有Item<1>到Item<n>的大小之和,无冗余开销。
内容的提问来源于stack exchange,提问作者那温度
相关产品推荐
相关产品推荐

