問題タブ [subscript-operator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ オーバーロードされた演算子 []
入力したい本の量を入力し、オーバーロードされた演算子 ([]) を使用するアプリケーションを作成しましたが、配列を格納するためのポインターを与えるたびに、次のようなエラーが発生します。
2 IntelliSense: 式には整数型またはスコープなしの列挙型が必要です。行:11 列:24 図書館の本
と
エラー 1 エラー C2440: 'initializing' : 'std::string' から 'unsigned int' に変換できません 行:11 列:1 図書館の本
とにかくここに私のコードがあります:
また、これを正しくコーディングしたかどうかも 100% 確信が持てません。エラーが発生した場合は、教えていただき、ありがとうございます。
r - 添字演算子「[」のオーバーロード
"["
作成したカスタム クラスの添え字演算子 ( ) をオーバーロードしようとしています。下記の件について、どう対処したらよいか検討中です。
- オペレーターが lhs または rhs のどちらを使用しているかをどのように判断できますか? すなわち
a[x] = foo
対foo = a[x]
foo = a[,x]
最初のパラメーターをどのように識別できますか?- a[seq(x,y)] を使用すると、シーケンス全体が展開されているようです。展開せずに最初、ステップ、最後の値を取得する簡単な方法はありますか?
編集:私の最初のポイントは複数の回答を受け取りました。その過程で、2番目の答えを見つけました。「missing」関数を使用して、どのパラメーターが存在するかを把握できます。
サンプルコードは次のとおりです。
ポイント3は私にとって最も優先度が低いため、この質問への回答を受け入れました。
c++ - 配列サブスクリプション: 参照とプロキシ クラス メソッドを返す
テンプレート クラスの Subscript('[]') 演算子をオーバーロードする方法を探しているときに、2 つの異なる手法に出会いました。
最初のテクニック:
コンテナーへの戻りポインターを直接オーバーロードしoperator []
ます。これにより、値の読み取りと値の割り当ての両方が可能になります。この手法の実装例:
次のようにmain()
:
出力:
2 番目のテクニック:
2 番目の手法では、プロキシ クラスを宣言し、operator =
そのクラスを介してオーバーロードします。この手法の実装例:
同じmain()
で、同じ出力が得られます。
私は個人的に2番目の方法が好きです。しかし、私は本当にこれら2つの方法を比較したい. これら 2 つの手法の主な機能上の違いは何ですか。これらの方法にはそれぞれどのような利点がありますか?
c++ - もっと簡潔なものから (*pointer)[ index ] 機能を取得する方法はありますか?
一次元スペクトルを表すクラスがあります。基礎となるデータ型は単純な浮動小数点数の配列です。スペクトルの要素を操作するために、次のように添字演算子をオーバーロードしました。
残念ながら、このクラスのほとんどすべての用途はポインターとして使用されるため、やや煩わしい(*pointerToSpectrum)[ index ]
表記法に対処する必要があります。
最初に 2 つのアイデアがありました。
私の最初のアイデアは、 の添え字演算子をオーバーロードすることでしたOneDSpectrum*
が、それは潜在的な問題とトラブルでいっぱいのバスケットのように見えます。
私の 2 番目のアイデアは、OneDSpectrum 用のある種のカスタム スマート ポインターを作成することでした。
だから私の質問はこれです: 機能を得るために行うことは合理的ですか? それとも、多くのを使用して対処する必要がありますか?SmartPointerToSpectrum[ index ]
(*pointerToSpectrum)[ index ]
(*pointerToSpectrum)[ index ]
ios - Swift 配列添字インデックス付けのバグ?
Playground に貼り付けることができる Swift コードをプロジェクトから分離しました。通常の Xcode 編集とプレイグラウンドの両方で、「指定された引数を受け入れる '+' のオーバーロードが見つかりませんでした」というエラーが発生します。エラーは、最後の (自明ではない) 行を参照しています。
「let iPlus1...」という行のコメントを外して次の編集を行うと、Swift はコードを受け入れます。
「let temp...」という行のコメントを外して次の編集を行うと、Swift は再びコードを受け入れます。
これらの編集はどちらも一見些細な置換であるため、私には意味がありません。Swift が暗黙のうちに型キャストすることは決してないことを認識しています。元のコードで試みられた暗黙的な型キャストはないようです。すべての Int と Double は意図したとおりに宣言されています。これは Swift 配列の添字インデックス付けのバグだと思い始めています。
c++ - operator[] が 1 つの引数しかとらないのはなぜですか?
operator[] が引数を 1 つしかとらないことに関連する質問はたくさんありますが、実際にその理由を述べているものは見つかりません。
たとえば、関数をmatrix[0, 3]
呼び出すことは、言語の非常に自然な拡張のようです。ElementT& operator[](SizeT x, SizeT y)
この構文が言語に含まれていない特定の理由 (非互換性など) があるのでしょうか、それとも動機の欠如以外に、実際に追加を妨げているものはありますか?
(注: これは重複としてマークされていますが、そうではありません。この質問は、「この構文が言語にないのはなぜですか?」であり、「問題を回避するにはどうすればよいですか?」ではありません。前述のように、多くの質問があります。それらは後者に対応していますが、前者に対応しているものはありません。)
swift - Swift で CKRecord に添え字を定義するときのスタック オーバーフロー
この質問CKRecord
は、Swift で添え字を使用できるかどうかを尋ねます。質問者が望んでいたことを行う方法はすでに知っていましたが、それを順列するたびにスタックオーバーフローが発生します。
ゲッターでスタックオーバーフローが発生します。(セッターは試したことがないのでそちらでも発生するかもしれません。) objectForKey:
、objectForKeyedSubscript:
、 で実装してみましvalueForKey:
た。すべてが同じ結果を生成します: スタック オーバーフロー。
CKRecord
確かにObjective-Cで書かれているので、これは非常に奇妙です。Swift のsubscript
メソッドを再帰的に呼び出すのはなぜですか? 意味がない。Nate Cook は、質問者への回答の中で、なぜ Swift が自動的にブリッジしないのか疑問に思っていobjectForKeyedSubscript:
ます。それを行うためのコードが完全に焼き付けられていない可能性がありますが、この問題を引き起こしています。を持つ別のクラスで試してみる必要がありobjectForKeyedSubscript:
ます。
アップデート
objectForKeyedSubscript:
通常はブリッジされているようです。適切なメソッドを使用して Objective-C でクラスを作成し、それをブリッジング ヘッダーに追加すると、インデクサーがそこにあり、問題なくコンパイルされました。さらに良いことに、スタックオーバーフローなしで機能しました。
これは、 で非常に異常なことが起こっていることを意味しCKRecord
ます。
理論
Swift で、 aをキーとしてメソッドを継承しNSObject
て実装するクラスを作成すると、 this になります。(「純粋な Swift」クラスの場合、これは当てはまらないと思います。) これは、Swift クラスを Objective-C にインポートし、そこにあることを確認することで確認できます。subscript
String
objectForKeyedSubscript:
objectForKeyedSubscript:
からCKRecord
派生しているためNSObject
、実装subscript
するとデフォルトの実装がオーバーライドされます。さらに、objectForKey:
and valueForKey:
all 最終的に呼び出された のように見えますがobjectForKeyedSubscript:
、その結果 (読み取り: "is the same as") が呼び出されsubscript
、スタック オーバーフローが発生します。
これが、スタック オーバーフローが発生する理由を説明している可能性があります。が自動的にブリッジされなかった理由はまだ説明されていませんobjectForKeyedSubscript:
が、おそらく、 の定義がsetObject:forKeyedSubscript:
正規のものとはわずかに異なる型シグネチャを持っているためです- (void)setObject:(id <CKRecordValue>)object forKeyedSubscript:(NSString *)key;
。これは Objective-C と何の違いもありませんが、「ブリッジング コード」につまずく可能性があります。結局のところ、Swift はかなり新しいものです。