在标准C++中复制 C++/CLI 多维数组模板类

Replicating C++/CLI multidimensional array template class in standard C++

本文关键字:C++ 数组 CLI 标准 复制      更新时间:2023-10-16

在 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] intIndexList<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