すべての演算子を操作するデータ オブジェクトがあります。これは、可変ptrsを含むデータの1つのチャンクであり、さまざまなタイプとサイズなどをいくつでも持っています。型は、列挙型とテンプレート、および switch ステートメントで処理されます。したがって、各 x に対して、d[x] は 1 つの型であり、任意の数を持ち、ベクトルにすることができます。つまり、d[x][y] と d[x][y][z] です。これを支援する内部ヘルパー オブジェクトを作成しました。したがって、[] をオーバーロードしてこのようなことを行うと、正しい型が正常に返されます: (gcc 4.6.1)
[編集: d(x,y,z) でも同じ問題があります。問題は [] 演算子ではありません]
int i = d[0][3][5];
このヘルパー オブジェクトで T() をオーバーロードしています。
template <class T>
data::helper::operator T (); // switch(x)...return different types
data::helper data::operator [] (int i); // recurse, return helper(t, d, x, i, j);
したがって、このオブジェクトを返すだけで、その時点で型が解決されます (t->get< char>(d、x、i、j) などに関連付けられたケースで切り替えます)。だから問題は、私がこのようなことをしたいのなら
int i = d[0][1] + d[4][2];
if (d[5][1] != d[3][0]) ...
その後、この一時的な配列ヘルパー オブジェクトを取得するために、すべての演算子をオーバーロードする必要がありました。そして今、一部のオペレーターのために一時的な値を作成しなければならないことがあり、これは苦痛です。
基本的に、コンパイラーがこれらのうちの 2 つを取得して追加しようとする前に、まず演算子 T() を解決する必要があるように感じます。
とにかく、= や += などの演算子に対してこれを行う必要がありますが、これらの他のすべての演算子を定義するのに役立つ膨大な数のマクロを削除したいと思います。
また、どうにかして左辺値演算子をオーバーロードできれば、= 演算子のことは気にならなくなったような気がします。おそらくそれと &() (現在はテンプレート化された ptr を返すだけです)。...?または実際には、少なくとも d[] = 何かについては、これが私が意味することですが、これを機能させることはできません。任意の型の ptr をこの戻り値に変換する方法がわかりません。
data::helper & data::operator [] (int i);
私はこれのほとんどを機能させていますが、それは多くのコードです。一時的なことを行うには、すべてのアクセスに追加の if ステートメントを追加する必要があると思いますが、これはやりたくないことです。それで、私は何を逃したのですか?
編集: d(x,i,j) の使用は d[x][i][j] と同じです。投稿されたリンク nm で使用されているものの少なくとも最初の部分を行っていると確信しています。問題は、ステートメントで使用される前に、最後のヘルパー オブジェクトをデータに解決することです。どういうわけか、コンパイラは、ヘルパー オブジェクトを単独で解決する方法を知っているにもかかわらず、ヘルパー オブジェクトを受け入れる演算子を必要としています...と思います。すべてのオペレーターに過負荷をかけるのに数日かかったので、すべての詳細を忘れてしまいました. :)
しかし、現在の主な問題は、次のようなものです。
helper operator + (helper & l, helper & r)
以下を定義したいのですが、使い慣れていません。それなら、問題が解決するかもしれないと思います。単項演算子 ~、-、および後置 ++、-- についても同様の話です。
template <class T> T operator + (helper & l, helper & r)
しかし、これはすべて、私の T() に何か問題があるためだと思います。これのほとんどは私にとって新しいものなので、何かが欠けているに違いありません。