在标准C++中复制 C++/CLI 多维数组模板类
Replicating C++/CLI multidimensional array template class in standard C++
在 C++/CLI 中,您可以为多维数组指定以下内容。
array<int, 2>^ Foo = gcnew array<int, 2>(10);
Foo[0, 0] = 1;
Foo[1, 0] = 2;
// ...
我正在尝试通过名为 my_array 的模板化类以标准C++中最接近的语法(允许 C++11)复制上述内容。
例如
template <typename T, int rank = 1>
class my_array { };
是否有可能通过一些逗号运算符重载技巧来实现标准C++下的 C++/CLI 语法,以及覆盖 my_array 的下标运算符?
理想情况下,我希望my_array以这种方式使用(相当于上面的示例):
my_array<int, 2> Foo = // ... (ignore this part - already implemented)
Foo[0, 0] = 1;
Foo[1, 0] = 2;
// ...
如果有人想知道,我正在为 GCC 创建一个 C++/CLI 等效项,目前该框架不支持多维数组。我希望以最接近 C++/CLI 语法的方式添加该功能。
不,在标准C++中是不可能的。事实上,operator[]
只能接受一个论点。
您可以使用以下解决方案之一实现类似的语法:
-
operator()
有几个论点,比如array(i, j)
- 对参数使用代理类,例如
array[makeIndex(i, j)]
- 使用逗号运算符:
array[makeIndex(i), makeIndex(j)]
- 或者
array[IndexBegin, i, j]
.
另请参阅这个问题和那个问题。
--优化说明 --
在逗号路由中,您将使用逗号运算符构建动态列表,数组将检查这些列表的长度。在朴素的实现中,这些检查将是运行时和冗余的(在循环中使用时)。
更好的选择:使用静态已知长度的列表(带有模板) 就像IndexBegin
是 IndexList<0>,IndexList<N> [comma] int
是IndexList<N+1>
。然后,如果您的数组也静态地知道其维度,例如 2D 数组Array<2>
那么您可以在编译时检查 2D 数组是否只接受 2 个索引。
在 C++23 中,您可以在标准 C++.
中使用此语法相关链接:
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2128r6.pdfhttps://eel.is/c++draft/over.sub
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '