仍在与我的教育多维矩阵作斗争。仍在初始化。首先,在初始化数组时,我初始化存储矩阵结构的字段 - 其维度的一维数组。该数组的长度等于矩阵的维数。数组元素 - 每个维度的矩阵元素数量。因此,数组构造函数之一具有可变数量的参数(参数包) - 只是列出矩阵的维度。
using dimension_t = unsigned char;
template <dimension_t Dimension_, std::unsigned_integral SizeType_ = size_t>
class TMultiDimParam {
private:
SizeType_ data[Dimension_];
public:
template <std::integral ...size_types>
TMultiDimParam(const size_types... sizes) :
data{ static_cast<SizeType_>(sizes)... }
{}
};
任务:有必要在编译阶段禁止调用参数数量错误的构造函数。
幸运的是,您不需要执行任何操作来防止超出参数数量。自从尝试时
sib::TMultiDimParam<3> mds0(1, 2, 3, 4);
排队
data{ static_cast<SizeType_>(sizes)... }
会立即出现错误
C2078 初始化程序太多
但如果我打电话的话
sib::TMultiDimParam<3> mds0(1, 2);
然后它将被编译并且数组将被零填充。所以这是我想避免的。
解决方案是将数组元素类型 ( SizeType_
) 包装在没有默认构造函数的包装类中。
using dimension_t = unsigned char;
template <dimension_t Dimension_, std::unsigned_integral SizeType_ = size_t>
class TMultiDimParam {
private:
template<std::unsigned_integral T>
struct TDimParam {
T data;
TDimParam() = delete;
TDimParam(T value) : data(value) {};
};
TDimParam<SizeType_> data[Dimension_];
//SizeType_ data[Dimension_];
public:
template <std::integral ...size_types>
TMultiDimParam(const size_types... sizes) :
data{ static_cast<TDimParam<SizeType_>>(sizes)... }
//data{ static_cast<SizeType_>(sizes)... }
{}
};
而且,你瞧,它奏效了。现在尝试
sib::TMultiDimParam<3> mds0(1, 2);
结果出现错误
C2280 “sib::TMultiDimParam<3,size_t>::TDimParam<SizeType_>::TDimParam(void)”:尝试引用远程函数
这里的基础对我来说开始相当不稳定,因为我希望(我认为这是任何容器在以某种结构的形式直接存储数据之后的第一个含义)这样的技巧不影响性能。而且好像也没有什么效果。我在发布模式下比较了反汇编程序,两个选项是相同的。甚至优化(它不创建临时数组,然后我对其求和,但立即对数字求和)也以相同的方式工作。但这只是“某种程度上”,因为对我来说,正如我已经说过的,这是一个不稳定的基础。知识太肤浅了。如果有人理解,出于体育兴趣或出于对那些不想学习所有东西的懒惰人的怜悯,会说:我是否在正确的方向上前进?或者有更简单/更清晰/更正确的方法吗?
有一个更简单的方法:
无需诉诸概念或强制转换任何内容,在上一个问题中,我们弄清楚了如何避免整数转换和溢出问题。