假设我想在 C++ 中创建一个矩阵类,它可以使用大括号进行初始化:
matrix<int> M = {{1,2,3}, {2,3,1}}
正如我发现的那样,右侧是一个 std::initializer_list
对象。我尝试实现以下内容:
template <typename ring>
class matrix {
private:
std::vector<std::vector<ring>> vals;
public:
matrix<ring>& operator=(const std::initializer_list<std::initializer_list<ring>>& rhs);
};
template<typename ring>
matrix<ring>& matrix<ring>::operator=(const std::initializer_list<std::initializer_list<ring>>& rhs) {
unsigned new_rows = rhs.size();
unsigned new_cols = 0;
for (unsigned i=0; i<new_rows; ++i) if (new_cols < rhs[i].size()) new_cols = rhs[i].size();
vals.resize(new_rows);
for (unsigned i=0; i<vals.size(); ++i) {
vals[i].resize(new_cols);
for (unsigned j=0; j<new_cols; ++j) {
vals[i][j] = rhs[i][j];
}
}
return *this;
}
这不起作用,我得到了错误消息,即 rhs 无法接受 rhs[i][j] 实现。我做错了什么?
答案 0 :(得分:2)
matrix<double> M = {{1,2,3}, {2,3,1}}
是 copy-list-initialisation。你需要一个构造函数
matrix<ring>(std::initializer_list<std::initializer_list<ring>> rhs) : vals(rhs.begin(), rhs.end()) {}
我会保留赋值运算符,但使用构造函数来实现它
matrix<ring>& matrix<ring>::operator=(std::initializer_list<std::initializer_list<ring>> rhs) {
matrix temp = rhs;
std::swap(vals, temp.vals);
return *this;
}
另外:std::initializer_list
已经是一个具有常量引用语义的类型,你也可以按值来获取它。