【发布时间】:2022-06-13 20:02:34
【问题描述】:
我正在探索在没有边车大小信息的情况下存储文字数组(任何类型)的方法。我已经勾勒出了一些方法,但对于每一种方法都有一些挥之不去的问题。这是最简单的方法,模板超过数组大小。请注意,这是一个简单的测试用例,实际的类可能有额外的成员、额外的模板参数和必须提供的模板参数。
template <size_t I>
struct A0 {
std::array<const char*, I> a;
};
问题是大小与字符串文字分离,使得这些错误太容易了:
// error, not caught
auto a0 = A0<3>{{"1","2"}};
虽然下面的初始化是有效的,因为 C++20 不允许部分 CTAD,如果指定任何模板参数 必须,它就无法工作。它还用样板交换样板:'' 以换取'std::array'。不指定类型CTAD将无法推导出模板大小参数'I'。
auto a0 = A0{std::array{"1","2"}};
是否有扣除指南允许:
auto a0 = A0{{"1","2"}};
【问题讨论】:
-
更好地编辑原始问题。或者至少删除旧的
-
如果您想要一些控制和(禁用聚合初始化的某些行为),您可以使用常规构造函数。
标签: c++ templates c++20 c-strings