1

在 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 的语法方式添加该功能。

4

1 回答 1

2

不,这在标准 C++ 中是不可能的。Indeedoperator[]只能接受一个参数。

您可以使用以下解决方案之一实现类似的语法:

  • operator()有几个论点,比如array(i, j)
  • 使用代理类作为参数,例如array[makeIndex(i, j)]
  • 使用逗号运算符:array[makeIndex(i), makeIndex(j)]
  • array[IndexBegin, i, j]

另请参阅这个那个问题。

-- 优化说明 --

在您走逗号路线时,您将使用逗号运算符构建动态列表,并且数组将检查这些列表的长度。在一个简单的实现中,这些检查将是运行时和冗余的(当在循环中使用时)。

更好的选择:使用静态已知长度的列表(带有模板) Like IndexBeginis IndexList<0>, IndexList<N> [comma] intis IndexList<N+1>. 然后,如果您的数组也静态地知道它的维度,例如 2D 数组,Array<2>那么您可以在编译时检查 2D 数组是否只接受 2 个索引。

于 2012-11-26T12:56:54.457 回答