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 { };

my_array の添え字演算子をオーバーライドするとともに、標準 C++ で C++/CLI の構文を達成するために、コンマ演算子のオーバーロード トリックを使用することは可能ですか?

理想的には、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[]は引数を 1 つしか取ることができません。

次の解決策のいずれかを使用して、同様の構文を実現できます。

  • operator()のようないくつかの引数でarray(i, j)
  • 引数にプロキシ クラスを使用します。array[makeIndex(i, j)]
  • コンマ演算子の使用:array[makeIndex(i), makeIndex(j)]
  • またはarray[IndexBegin, i, j]

this and that questionも参照してください。

-- 最適化に関する注意事項 --

コンマ ルートでは、コンマ演算子を使用して動的リストを作成し、配列がこれらのリストの長さをチェックします。単純な実装では、これらのチェックは実行時に行われ、冗長になります (ループで使用される場合)。

より良いオプション: 静的に既知の長さのリストを使用します (テンプレートを使用) Like IndexBeginis IndexList<0>, IndexList<N> [comma] intis IndexList<N+1>. 次に、2D 配列のように、配列がその次元を静的に認識している場合は、2D 配列がArray<2>2 つのインデックスのみを受け入れることをコンパイル時に確認できます。

于 2012-11-26T12:56:54.457 に答える