什么类型有多维数组
What type have multidimensional array?
我正在编写自己的2d矩阵类。我想把这门课的用法设计得更接近真实的数学符号。例如,我希望以矩阵[3,6]的形式访问元素。但c++没有提供这种能力,但我可以通过下一种方式访问基础多维数组:
int matrix[2][2] = {};
int val = matrix[1][0];
所以我决定制作返回基数组的函数。对于这个角色,最好的函数是operator()。所以我可以用下一种方式访问:matrix()[1][0]。好的,我开始实现它,并坚持:(.看看我有什么:
template <typename ValType>
class Matrix2D
{
protected:
ValType m_data[2][2] = {};
public:
ValType** operator()() // <--- what type?
{
return m_data;
}
}
但我在以上的函数中收到编译器错误
错误C2440:"return":无法从"double[2][2]"转换为"double***">
我理解这个错误,但不知道我必须更改什么才能避免这个错误?函数必须返回什么类型?
由于它被标记为C++11,因此应该使用std::array
。使用索引运算符,而不是呼叫运算符:
template <typename ValType>
class Matrix2D
{
protected:
using Row = std::array<ValType, 2>;
std::array<Row, 2> m_data;
public:
Row& operator[](size_t idx)
{
return m_data[idx];
}
};
通过这种方式,您可以只写matrix[1][0]
,而不必写matrix()[1][0]
(坦率地说,这看起来像是一个拼写错误)。
此外,如果你喜欢同时进行两个索引,你可以写信给你的呼叫接线员,简单地同时进行这两个索引:
ValueType& operator()(size_t x, size_t y) {
return m_data[x][y];
}
这将允许您将matrix(1, 0)
作为matrix[1][0]
的替代方案。
2D数组衰减为指向其第一行的指针。以下内容应该有效:
typedef ValType Line[2];
Line* operator()()
{
return m_data;
}
你可以用类似的方式进行索引:
ValType* operator[](int line)
{
return m_data[line];
}
您将选择的类型取决于您。:)例如
ValType ( * operator()() )[2]
{
return m_data;
}
当一个数组由函数的值返回时,它被隐式转换为指向其第一个元素的指针。你有一个像一样声明的二维数组
ValType m_data[2][2] = {};
因此,它的元素又是一个类型为ValType[2]
的一维数组。因此,指向这样一个对象(数组的第一个元素)的指针将像一样声明
ValType ( *p )[2] = m_data;
或
ValType ( & operator()() )[2][2]
{
return m_data;
}
在这种情况下,函数返回对数组的引用。函数本身可能不会返回数组,但它们可能会返回对数组的引用。您可以通过以下方式使用功能
ValType( &a )[2][2] = obj(); // where obje is an object of the template class
或者你可以写更简单的
auto &a = obj();
甚至类似
ValType ( * operator()() )[2][2]
{
return &m_data;
}
除了函数返回一个指向整个数组的指针之外,这个用例看起来与第一个用例类似。
当然,在这三种情况下,您都可以使用一些使代码更简单的typedef。但无论如何,你需要知道我展示的合成器。
请注意,类定义的右大括号后面必须有一个分号。:)
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 数组类型 int[n][n] 不可赋值,因为表达式必须具有常量值
- 取消引用结束指针到数组类型的一个
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 如何在数组类型的模板代码中计算std::size_t
- LLVM 无法将数组类型强制转换为常量数组
- 推荐的方法在不初始化值的情况下使数组类型为 std::unique_ptr?
- 特征:从数组类型中获取标量类型是否记录?
- T D[N] 总是声明数组类型的对象吗?
- 如何在模板中推断数组类型?
- 尝试使用 Array 类的模板构造整数数组时,错误:为什么数组类型"int [5]"不可分配,
- 如何将二维数组类型字符(字符串)作为函数参数传递?
- 如何为所有非数组类型专门化模板?
- 数组类型 (C++) 的初始化
- 我预测char数组类型值只能投射指针类型
- 将数组类型更改为 Int16 会节省存储空间吗?
- 采用通用数组类型的函数
- 数组类型 'int [8]'不可分配
- 数组类型 'float [size]'不可分配
- C++。候选模板被忽略 - 无法将数组类型与自身匹配