使用作为参数传递的 std::intializer_list 初始化 std::数组
Initializing an std::array with an std::intializer_list passed as a parameter
我正在C++中实现一个矩阵类,我希望能够使用初始化器列表对其进行初始化,如下所示:
Matrix<double, 2, 3> m({{1,2,1},
{0,1,1}});
在类中,我实现了这样的构造函数:
template<typename Ty, unsigned int rows, unsigned int cols>
class Matrix
{
std::array<std::array<Ty, cols>, rows> data;
public:
Matrix(const std::initializer_list<std::initializer_list<Ty>>& list)
{
int i = 0;
for (auto& list_row : list)
{
int j = 0;
for (auto& list_value : list_row)
{
data[i][j++] = list_value;
}
i++;
}
}
}
代码有效,但我有几个问题。是否有可能使其安全,因此它只需要一定大小(矩阵的大小)的初始值设定项列表,其次我可以使代码更简洁 - 我想象过这样的事情:
Matrix(const std::initializer_list<std::initializer_list<Ty>>& list)
: data(list)
{ }
它不起作用,但任何更好的方法将不胜感激。
有一种非常简单的方法可以使其安全:
template<typename Ty, unsigned int rows, unsigned int cols>
class Matrix
{
std::array<std::array<Ty, cols>, rows> data;
public:
Matrix(std::array<std::array<Ty, cols>, rows> const& in)
: data(in)
{ }
};
这让你几乎可以使用你想要的语法 - 你只需要一组额外的{}
。
没有办法静态强制执行std::initializer_list
的大小 - 您必须assert
或throw
以防止我传入一堆额外的值并导致您执行超出范围的写入。
相关文章:
- 使用std::multimap迭代器创建std::list
- 使用"std::unordereded_map"映射到"std::list"对象
- 使用std::list创建循环链表
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 包含 std::list 的结构体的 C++ 初始化
- 在基于范围的 for 循环期间插入 std::list 的后面
- 循环挂起迭代的 std::擦除 on std::list
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- std::list 中的迭代器感知对象
- std::list 可以用于简单的无锁队列吗?
- 使用 std::list 存储顶点并使用 SFML 绘制它们
- C++11 基于范围的 for 循环,用于 std::list
- 向 std::list 添加新元素的复杂性
- 如何使用 std::list 模板的迭代器擦除
- 将元素添加到 std::list 在多线程中,无需 C++ 互斥锁
- 如何将文件的一部分读取到std::list缓冲区?
- 抽象和派生与std::list相结合
- std::list 的两个 insert() 方法签名之间的实现差异
- C++:我可以重用/移动 std::list 元素从中间到结尾吗?