如何让模板化静态数组字符串类自动推导大小并保持聚合特性
实现支持自动推导大小的聚合类型sstring模板类
要在保持sstring为聚合类型的同时,实现从字符串字面量自动推导模板大小的便捷初始化,核心是利用C++17的**类模板参数推导(CTAD)和推导指引(deduction guides)**特性,具体方案如下:
实现步骤
- 保留原聚合类结构:不添加任何用户声明的构造函数、析构函数或赋值运算符,维持聚合类型的特性。
- 添加针对字符串字面量的推导指引:让编译器能根据字面量的实际长度(包含终止符
\0)自动推导模板的size参数。
完整代码
#include <cstddef> template<size_t size> class sstring { public: char buffer[size]; }; // 推导指引:匹配字符串字面量,推导size为字面量的总长度(含'\0') template<size_t N> sstring(const char (&)[N]) -> sstring<N>;
支持的使用方式
- 自动推导大小(无需指定模板参数):
sstring str1 = "My string"; // 编译器自动推导为sstring<10> sstring str2{"My other string"}; // 同样自动推导size,支持列表初始化语法 - 手动指定大小(保留原需求的灵活性):
sstring<20> str3 = "Short string"; // 手动指定更大的缓冲区,聚合初始化仍有效 sstring<5> str4 = {"Hi"}; // 聚合初始化,剩余空间自动填充'\0'
关键说明
- 推导指引仅对字符串字面量有效,因为字面量的类型是
const char[N](编译器可知长度N);如果传入const char*指针,无法推导大小。 - 整个实现完全保留了聚合类型的优势:无额外构造函数开销、内存布局与原生数组一致、支持聚合初始化语法。
内容的提问来源于stack exchange,提问作者Dain
相关产品推荐
相关产品推荐

