問題タブ [conversion-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++ - 許容できるプログラミング手法-変換とアップキャスト
次の許容可能なプログラミング手法は次のとおりです。
許容できる/許容できない理由は何ですか?
(TestAでTestB代入演算子を作成することについて、明白な提案をしないでください。これは、アップキャストおよび/または変換演算子をこの方法で使用する必要があるかどうかに関する質問です)。
また、質問の賛成/反対のコメントにフィードバックを残して、将来質問を改善できるようにすることをお勧めします。
c++ - C++変換演算子と過負荷解決
この例では、いくつかのオーバーロードが含まれています。
そしてその出力:
私の質問は-なぜvoid operator <<(A<T> &, const void *)
声明を求められているのtest << source;
ですか?誰かがこのケースをカバーする規格の特定の部分を引用できますか?
c++ - この場合、変換演算子は有効ですか?
通常、本は通常、c構造体をまとめるときに変換演算子の使用を推奨していません。たとえば、C文字列のラッパーである(と思われる)c ++文字列は、変換演算子を提供しません。代わりに、メソッドを提供しc_str()
ます。
しかし、私の場合は例外かもしれないと真剣に考えています。これがSDL_Surface.
クラス宣言です。
この場合、をSDL_Surface*
必要とする他のSDL関数との互換性を容易にするために、に変換演算子を追加する必要があると真剣に考えていますSDL_Surface*
。
どう思いますか:
- 変換演算子は賢明でしょうか?
- または、次のような方法を使用する必要があり
c_str()
ますか? - または、別のより良い解決策はありますか?
c++ - static_cast で実装された変換演算子
ここで提起した問題に続いて、この質問をします。
ポイントは至ってシンプルです。この種の 2 つのクラスがあるとします。
次に、次のような型変換があるとします。
問題は、この変換の標準準拠の動作はどうあるべきかということです。
と同じにする必要がありますか、const T & val(static_cast<const T &> (param) )
それともスタック オーバーフローまで再帰的に反復する必要がありますか? GNUg++
でコンパイルした最初の動作と Intel でコンパイルした 2 番目の動作が得られたことに注意してくださいicpc
。
私はすでに標準 (static_cast のセクション 5.9 と変換のセクション 12.3) をのぞき見しようとしましたが、経験不足のため、答えを見つけることができませんでした。
これを手伝ってくれる時間を割いてくれた人に、前もって感謝します。
c++ - C++ の暗黙的な変換演算子の優先順位
編集:Mike Seymour のコメントに従って、それに応じて実装を置き換えoperator std::string () const;
て変更しました。operator char * () const;
これにより暗黙のキャストが可能になりますが、何らかの理由で、unsigned long int 演算子が char * 演算子よりも優先されます。クラス、std::string がある場合。私の CustomizedInt クラスは、私が望む機能をサポートするためにいくつかのものから継承する必要があるという予感があります。に関するマイクのコメントを詳しく説明してもらえstd::basic_string
ますか? 私はそれを正しく理解したかどうかわかりません。
私はこのコードを持っています:
「Called operator unsigned long int; 123」を出力します。私の質問は次のとおりです。
- 演算子 unsigned long int を削除した後、x を明示的に std::string にキャストする必要があるのはなぜですか? 暗黙のキャスト演算子 (std::string) を直接呼び出さないのはなぜですか?
- どの暗黙的なキャストが許可され、どの優先順位が優先されるかを説明するドキュメントはありますか? 演算子 unsigned int を演算子 unsigned long int と共にこのクラスに追加すると、 << 演算子のあいまいさに関するコンパイラ エラーが発生するようです...
- また、そのような演算子を定義するのは適切ではないことはわかっていますが、関連する注意事項を完全に理解しているかどうかはわかりません。誰かそれらの概要を教えてください。パブリック メソッドの ToUnsignedLongInt と ToString を定義する方がよいのでしょうか。
.net - .net 演算子のオーバーロード??? 型変換演算子、正確にはどのように機能しますか?
私は最初に .Net で演算子のオーバーロードに遭遇しました。ずっと前に C++ で使用していましたが、それは "+" のような演算子のオーバーロードのようなものでした。
私は構造体を持っていますAccessToken
:
私は最初のメソッドがコンストラクタであることを理解しましたが、正確に2番目のメソッドがやっているのか疑問に思っていましたか? 間違いなく、ある種の演算子のオーバーロードです。http://msdn.microsoft.com/en-us/library/s53ehcz3(v=vs.71).aspxを読みましたが、正確なアイデアを得ることができませんでした。
c++ - あいまいなstring::operator=intおよびstringへの暗黙的な変換を伴う型の呼び出し
次のプログラムがあるとします。
Visual Studio 11でコンパイルされますが、clangやgccではコンパイルされません。暗黙的にaからaGenericType
に変換したいので問題が発生しますが、aを返す可能性もあるため、あいまいさがあります(両方が一致します)。int
char
string
operator=(char)
operator=(string)
GenericType
ただし、コピーコンストラクターは問題ありません。
私の質問は、mainの内容を変更せずに、このあいまいさを解決するにはどうすればよいですか?GenericType
この状況を処理するために変更するには何をする必要がありますか?
c++ - ポインター変換、Two* を One* に変換できません
One と Two の 2 つのクラスがあるとします。One と Two は本質的に同じですが、Two は One に変換できます。
Two は One にアクセスできますが、One は Two にアクセスできません。main.cpp には次のものがあります。
One のポインタを Two のアドレスにしようとすると、エラーが発生します。エラーは「エラー C2440: '初期化中': 'Two *' から 'One *' に変換できません」です。
それが可能であるとしても、私は一生これを行う方法を理解することはできません。どんな助けでも大歓迎です。
編集: で Two.h に新しい行を追加しましたoperator One& () const { return *this; }
。この変換演算子を機能させるために使用しようとしている関数は次のとおりですvoid TestRefConstPrint(const One &testClass);
。以下のメインでは、「パラメータ 1 を Two から変換できません」という新しいエラーが表示されます。
メインの中で私は:
c++ - 構造体でビット操作を行うにはどうすればよいですか?
マスクを使用してビット演算を実行したいビットフィールド構造体があります。これを行うための最も簡単で最も効率的な方法を知りたいです。変換演算子を使用してみましたが (2 つの構造体で & 操作を行うには非効率的な方法のようです)、エラー C2440: 'type cast' : cannot convert from 'const test::dtType' to 'char' が発生します。この変換を実行できるユーザー定義変換演算子がないか、演算子を呼び出すことができません
ビットごとの操作を行うために void ポインターを使用してみました。コンパイルはできますが、テストしていません。
これは私たちが得ることができるのと同じくらい効率的ですか?本当に必要なのは long へのキャストだけですが、これには 3 つの追加のポインターが含まれます。
c++ - 最初の標準変換シーケンスによるユーザー定義の変換シーケンスの区別
この標準は、ユーザー定義の変換演算子を含む暗黙の変換シーケンスを区別するための2つのルールを提供しているようです。
13.3.3最高の実行可能な関数[over.match.best]
[...]実行可能な関数F1は、[...]の場合、別の実行可能な関数F2よりも優れた関数であると定義されます。
- コンテキストはユーザー定義の変換による初期化であり(8.5、13.3.1.5、および13.3.1.6を参照)、F1の戻りタイプから宛先タイプ(つまり、初期化されるエンティティのタイプ)への標準変換シーケンスは次のとおりです。 F2の戻りタイプから宛先タイプへの標準変換シーケンスよりも優れた変換シーケンス。
13.3.3.2暗黙の変換シーケンスのランク付け[over.ics.rank]
3-次の規則のいずれかが適用されない限り、同じ形式の2つの暗黙的な変換シーケンスは区別できない変換シーケンスです。[...]
- ユーザー定義の変換シーケンスU1は、同じユーザー定義の変換関数またはコンストラクターまたは集約初期化を含み、U1の2番目の標準変換シーケンスが2番目の標準変換シーケンスよりも優れている場合、別のユーザー定義の変換シーケンスU2よりも優れた変換シーケンスです。 U2の。
私が理解しているように、13.3.3を使用すると、コンパイラはさまざまなユーザー定義の変換演算子を区別できますが、13.3.3.2を使用すると、コンパイラは、引数にユーザー定義の変換が必要なさまざまな関数(一部の関数のオーバーロード)を区別できます。 f
((GCC 4.3の)次のコードが与えられた場合のサイドバーを参照してください。参照への変換が2回呼び出されるのはなぜですか?)
ユーザー定義の変換シーケンスを区別できる他のルールはありますか?https://stackoverflow.com/a/1384044/567292での回答は、13.3.3.2:3が、(変換演算子に対する)暗黙のオブジェクトパラメーターのcv-qualificationに基づいて、ユーザー定義の変換シーケンスを区別できることを示しています。コンストラクターまたは集計の初期化に対する単一のデフォルト以外のパラメーターですが、それぞれのユーザー定義の変換シーケンスの最初の標準変換シーケンス間の比較が必要になることを考えると、それがどのように関連するかわかりません。言及しているようです。
S1がS2よりも優れていると仮定すると(S1はU1の最初の標準変換シーケンスであり、S2はU2の最初の標準変換シーケンスです)、U1はU2よりも優れているということになりますか?言い換えれば、このコードは整形式ですか?
g ++(4.5.1)、Clang(3.0)、Comeau(4.3.10.1)はそれを受け入れ、非const-qualifiedを優先A::operator int()
しますが、あいまいで形式が正しくないために拒否されると思います。これは標準の欠陥ですか、それとも私の理解の欠陥ですか?