問題タブ [explicit-conversion]
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++ - 「明示的な演算子 bool()」が呼び出されないのはなぜですか?
私の期待は、A()
コンテキストに応じbool
て my を使用するように変換されるoperator bool()
ため、 print true
.
ただし、出力はであり、代わりに が呼び出されたfalse
ことを示しています。operator int()
explicit operator bool
期待どおりに呼び出されないのはなぜですか?
c++ - 特定のテンプレートのインスタンス化で、キーワード「明示的」をコンストラクターから削除できますか?
寸法の正確さを強制するテンプレート クラスを作成しようとしています (長さを時間で割ると速度が得られるなど)。
短編小説:「無次元」は可能なインスタンス化の 1 つです。すべてのインスタンス化を double から明示的に構築できるようにし、さらに "無次元" インスタンス化 (および無次元インスタンス化のみ) を double から暗黙的に構築できるようにすると便利です。
長い話:私のテンプレートクラスは次のようにレイアウトされています
このスタイルに従えば、は無次元量なので、aと doubleqty<0,0,0>
を足したり引いたりできるはずです。qty<0,0,0>
私は現在、宣言することでこれを強制しています
...しかし、それを定義するだけですqty<0,0,0>
。これは実行可能ですが、もっとうまくできると思います。double から への暗黙的な変換を許可した場合qty<0,0,0>
、 double と の追加はqty<0,0,0>
特別な処理を必要としません。ユーザーの間違いも、より示唆的なエラー メッセージを表示します --- 速度に double を追加しようとすると、関数が定義されていないと不平を言うのではなく、変換が不可能であることを示します (次元の非互換性の根底にある考えに到達します)。これにより、ユーザーはテンプレート クラスのエラーを疑う可能性があります)。
問題は、テンプレート パラメーターの他の組み合わせに対して暗黙的な構築を許可できないことです。そうした場合、qty と double の追加は常に成功します。ユーザーに次元の正確さについて考えさせ、加算する前に double 定数を適切な次元に明示的に変換するようにします (それが意図した操作である場合)。ただし、double からの明示的な構築を許可したい--- それがなければ、単純な宣言
厄介な変換関数が必要になります
つまり、私が本当に欲しいのは
ご覧のとおり、1 つのインスタンス化のみの仕様を削除できるかどうかはわかりません。またexplicit
、可能であれば、構文がどのようなものかわかりません。
c++ - 保護された継承、アップキャスト、および変換演算子
protected
継承を使用して C スタイルのstruct
メンバーを非表示にしようとしています。
これを行うことで、派生物はプログラムの残りの部分から隠しながらclass
からすべてにアクセスできるようになりましたが、コストがかかります。コンパイラは、派生物からベース C スタイルへの暗黙的なキャストを許可しなくなります。struct
class
struct
そのため、機能を再度有効にするために、派生にpublic
変換を追加しました。しかし、ここで奇妙なことが起こります:operator
class
- まず第一に、
operator
as : コンパイラにフラグを立てることができませんでした: コンパイラは、定義の型でexplicit
「不正なストレージ クラス」と言い始めます。struct
operator
- キーワードがなくても
explicit
、コンパイラは変換が呼び出された時点で変換をアクセスできないと認識します(私は を使用しましたstatic_cast<T>()
)。
何か案が?(私は Visual Studio 2010 を使用しています)
コード例:
c# - 演算子を明示的に指定することが重要なのはなぜですか?
私は自分のコードで使用するために、別の質問から以下のコードを借用しました(わずかに変更されています):
このコードの元の作成者は、MSDN の暗黙的および明示的なドキュメントに記載されている警告に正しく準拠していますが、ここに私の質問があります:潜在的に例外的なコードではexplicit
常に必要ですか?
したがって、PositiveDouble から派生したコード ("Volume" など) にいくつかの型があり、以下の最初の行のようにインスタンスを便利に設定できるようにしたいと考えています。
どこでも明示的なキャストを使用することを余儀なくされると、コードの可読性が大幅に低下します。ユーザーをどのように保護しますか? 私のプログラムのセマンティクスでは、Volume が負になることは決してありません。実際、それが発生した場合、例外がスローされることを期待しています。したがって、暗黙的な変換を使用してそれがスローされた場合、どのような「予期しない結果」が私を壊す可能性がありますか?
c# - C++/CLI での C# クラスの明示的な型キャスト
C# で記述した "JulianDate" 構造体があり、.NET ライブラリから DateTime へのカスタムの明示的な演算子があります。この明示的な演算子を C# コードで数回使用しましたが、問題なく動作します。
C++/CLI コードで同じ明示的な演算子を使用したいのですが、方法がわかりません。
私はもう試した:
DateTime^ dt = (DateTime^)jdate;
(コンパイルしますが、InvalidCastException が発生します)DateTime^ dt = safe_cast<DateTime^>(jdate);
(コンパイルエラーが発生します)DateTime^ dt = DateTime(*jdate);
(コンパイルされますが、dt には間違ったデータがあります: 1/1/0001 12:00AM)DateTime^ dt = dynamic_cast<DateTime^>(jdate);
(コンパイルしますが、null を返します)
安全なキャストの場合、次のエラーが発生します。
明示的なキャストを実行する適切な方法は何ですか? それとも、クラスではなく構造体で作業しているため、機能しないのですか? あるいは、C++/CLI は C# の明示的な演算子をサポートしていないのでしょうか?
c++ - ベクトル間の変換
A
と、および s からs へのB
暗黙的な変換の2 つのクラスがあります。も持っており、それを に変換したい。に暗黙的または明示的に変換できる変換を追加することは可能ですか?A
B
vector<A>
vector<B>
vector<A>
vector<B>
here で説明されている手法を使用できることはわかっていますが、2 つの間の暗黙的な変換を有効にする方法はありますか? または明示的な変換?
c# - C# の明示的な変換演算子
こんにちは、助けが必要です :) カスタム クラス Filters があり、その中に AForge.Point から System.Drawing.PointF に変換する明示的な変換演算子を定義しました。AForge.Point と System.Drawing.PointF はどちらもライブラリの構造体です。blob.CenterOfGravity は AForge.Point のタイプです。問題は、intelisense が「'AForge.Point' を 'System.Drawing.PointF' に変換できません。なぜこの変換ができないのかわかりません :/.すべての返信に感謝します。
c++ - サイズが 8 バイトのクラスを uint64_t に型キャストできませんか?
以下のコードがあるとします。
コンパイラは、「A から uint64_t に変換できません。ユーザー定義の変換演算子が定義されていません」というエラーを返します。
エラーは予期されたものですか? はいの場合、その理由は?