我正在探索存储没有 sidecar 大小信息的文字数组(任何类型)的方法。我已经概述了一些方法,但每种方法都有一些挥之不去的问题。这是最简单的方法,模板超过数组大小。请注意,这是一个简单的测试用例,实际的类可能具有其他成员、其他模板参数以及必须提供的模板参数。
template <size_t I>
struct A0 {
std::array<const char*, I> a;
};
问题是大小与字符串文字分离,使得这些类型的错误太容易出现:
// error, not caught
auto a0 = A0<3>{{"1","2"}};
虽然以下初始化是有效的,但由于 C++20 不允许部分 CTAD,如果有任何模板参数,它就无法工作must被指定。它还用样板换样板:“”来交换“std::array”。如果不指定类型 CTAD 将无法推断出模板大小参数“I”。
auto a0 = A0{std::array{"1","2"}};
是否有扣除指南允许:
auto a0 = A0{{"1","2"}};
您可以创建一个模板构造函数,如果用户指定了不正确的参数数量,则该构造函数与用户定义的推导指南相结合,要么推导出正确的参数计数,要么导致编译器错误:
template <size_t I>
struct A0 {
template<class ...Args>
constexpr A0(Args...args)
: a{ args... }
{
static_assert(sizeof...(args) == I, "parameter count does not match array size");
}
std::array<const char*, I> a;
};
template<class ...Args>
A0(Args...) -> A0<sizeof...(Args)>;
constexpr A0 a{ "1", "2", "3" };
static_assert(std::is_same_v<std::remove_const_t<decltype(a)>, A0<3>>, "expectation mismatch");
constexpr A0<4> a1 { "1", "2", "3" }; // compiler error: parameter count does not match array size
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)