問題タブ [overload-resolution]
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++ - 過負荷解決の問題
SO には既に C++ のオーバーロードに関する質問が山ほどあると言いたいのですが、それらの質問やフォーラムやニュースグループの他の投稿を 1 時間見ても、まだ困惑しています。
バックグラウンド
名前空間を作成し、それを A と呼びます。ここでは、多数のクラスが同じ方法で < 演算子を実装しています。コードの重複を避けるために、私はこれを書きました:
operator_forwards.h というヘッダー ファイルで、他のいくつかの宣言を行います。次に、次のような行を追加して、正しいクラスの友達にしました。
最後に、次のように、operators.h というファイルに定義を入れます。
すべてを 1 つのヘッダー ファイルに含めます。
問題
問題は、次のように operator< を呼び出すときです。
ex1.start<ex2.start
A::operator< は問題なく呼び出しますが、vector::iterator のより特殊化された operator< を検索するのではなく、自分自身を再帰的に呼び出します。エラー C2039: start は vector::iterator のメンバーではありません。
A::operator< が ex1.start に対して正しい operator< を呼び出すことを確認するためのアドバイスはありますか?
注: A::operator< を使用する約 20 のクラスがあるため、各クラスで個別に定義することを避けることができれば、それは素晴らしいことです。
c++ - 関数オブジェクトはオーバーロードの解決にどのように影響しますか?
関数オブジェクトは、オーバーロードの解決中に通常の関数とは異なる方法で処理されますか? もしそうなら、どのように?
関数を同等に呼び出し可能な関数オブジェクトに置き換えると、コードの意味が変わる次のケースに遭遇しました。
ここでの出力は「N::bar」です。これまでのところ、N::bar は ADL によって検出されており、N::bar とグローバル バーの両方が完全に一致しており、N::bar はテンプレートではないため優先されています。
しかし、グローバル バーを関数オブジェクトに変更すると、次のようになります。
出力は「グローバル バー」になりました。違いはなぜですか?
c# - オーバーロード解決の奇妙さ
これが C# 4+ 固有のものかどうかはわかりませんが、これに気付きました。
次のクラスを検討してください。
Foo
inへの呼び出しはBar
に解決されFoo(object, object)
ます。
それを次のように変更しながら:
Foo
inへの呼び出しはBar
に解決されFoo(object, DayOfWeek)
ます。
私の理解では、2 番目の例のように常に解決する必要があります。
これは「バグ」ですか、それとも私の理解不足 (または無知) ですか?
アップデート:
答えてくれてありがとう。私が見つけたようbase.
に、基本クラスでメソッドを呼び出すために使用できます。ただし、ミックスに別の派生クラスを追加すると、問題が再発します。
base.
呼び出しは で機能しますがProgram
、 に解決さFoo(object, object)
れDerived
ます。
で「冗長な」メソッドを作成することなくFoo(object,DayOfWeek)
、それからどのように呼び出すでしょうか?Derived
Program
c# - クラス定義でオーバーロードの設定を強制しますか?
私はジェネリッククラスを持っています。2 つのコンストラクターがあります。これらは私の組織のコードベースで広く使用されています。
いくつかの機能を追加したいが、下位互換性を維持したい。そこで、各コンストラクターに新しいブール値のオプション パラメーターを導入したいと思います。
ただし、 T がブール値であり、デフォルト値が渡される使用法がすでに山ほどあります。
現在、オーバーロード優先の法則に従ってsomeFlag
、型付きメソッドは「よく知っている」ため、コンパイラはそのようなコンストラクターの使用をすべてオーバーロードを受け入れるオーバーロードに結び付けています。ほとんどの場合、これは完全に理にかなっていますが、これは明らかに私の下位互換性を壊しています。
私の質問は簡単です:オーバーロード設定のデフォルトの法則をオーバーライドし、古いジェネリック オーバーロードを優先するものとして定義する言語機能はありますか?
もちろん、この設計の欠点は、(パラメーターのみで) 最初のオーバーロードを呼び出したいときはいつでも、someFlag
C# 4 仕様に従って名前付きパラメーターを指定する必要があることです。
他のデザインの提案も大歓迎ですが、まず私の質問に答えてみてください :)。
c# - プログラムでジェネリックを使用してオーバーロード解決を実行する方法
MethodBase
さまざまなオープン ジェネリック メソッド ( ) を参照する多くのインスタンスがありますexpected
。たとえば、次のメソッドを表します。
MethodBase
そして、実際に呼び出されたクローズドメソッドを参照する単一のインスタンス ( actual
) があります。
特にすべてのジェネリックの落とし穴と複雑さを考慮する場合、actual
クローズドメソッドが特定のオープンメソッドのいずれかと一致するかどうかをプログラムで確認するにはどうすればよいですか?expected
具体的には、特定のクローズドメソッドexpected
のリストからの正しいアイテムが2番目のものではないことを特定したいと思います。actual
T Foo<T>(string nevermind, T other);
また、MethodBase
一致する double Foo<double>(double something, string other)
結果がないようにしたいと思います。
候補メソッドを反復処理し、各パラメーターexpected
が対応するパラメーターから割り当て可能かどうかを確認actual
するのは良い方法ですか? もしそうなら、それは最も簡単な方法ですか?.NET のメソッド オーバーロード解決規則に従って選択されないメソッドに一致しない特別なケースを考慮する必要がありますか?
c++ - 一見あいまいなテンプレート関数のオーバーロード
これに遭遇したときに私が解決しようとした元の問題は、parse_impl
バージョンを選択することでした:
- (タイプの)パーサーが
U
という名前のフィールドを提供する場合は"skp"
、そのフィールドを使用します。 - そうでない場合は、デフォルト値を使用します。
私は次のコードを思いついた:
通話サイトは次のようになります。
これは、あるタイプとないタイプの両方で呼び出されますskp
。
そしてそれは(gcc4.7で)コンパイルされますが、理由はわかりません。skp
が存在する場合、両方enable_if
の式がtrueと評価され(skipper_type
明らかにunused_type
thenと等しくない)、呼び出しがあいまいになるはずです。どこが間違っているの?
c# - ユーザー定義の演算子で裸の null リテラルを使用する場合の奇妙なオーバーロードの解決
TimeSpan
(タイトルの「ユーザー定義」とは、 と の加算と減算が C# 標準の一部ではないという事実を指しDateTime
ます。それらは BCL で定義されています。)
nullableTimeSpan
とDateTime
値の持ち上げられた演算子をいじって、次のコードを書きました。フレームワークは と で異なる操作を提供することに注意してTimeSpan
くださいDateTime
。
TimeSpan
2 つを取り、 sum を返す、1 つの対称 (および可換) 加算がありますTimeSpan
。この加算の「逆」は、TimeSpan
を生成する2 の減算ですTimeSpan
。
次に、別の種類の加算、非対称があります。ここでは、1 つDateTime
(左オペランド) と 1 つTimeSpan
(右オペランド) を使用して を生成しDateTime
ます。この演算は非対称であるため、2 つの「種類」の逆行列があります。1 つDateTime
は互いに 2 を減算してTimeSpan
差を求めるもの、もう 1 つは 1 を取り、そこから 1DateTime
を減算してTimeSpan
結果を生成するものDateTime
です。
自然にいくつかの疑問が生じます。
o
許可されているのにint?
(ちなみに a ではないのはなぜlong?
ですか?) whileg
が許可されていないのは少し奇妙です。これは仕様でしょうか?あと、文字列連結で「ありえない」c
が解消されるのもちょっと不思議。どうやらコンパイラはnull
inc
が(string)null
. 一方、明示的な型の式object
を aに追加すると、コンパイルされません。DateTime
しかし、私の主な質問は、コンパイラがandのオーバーロードを選択できるのはなぜですか?d
l
m
c++ - 非ビルトインのテンプレート、ビルトインのオーバーロード
関数bar()をサポートするライブラリを提供しています。スカラー値(double、intなど)を渡したときの動作は、スカラー値ではないもの(予想されるすべての場合、ユーザー定義型)を渡した場合の動作とは異なります。だから私はこのようなコードを書きました:
これに関する問題は、main()の2行目にあります。このコードの結果は「T」の出力です。コンパイラーはbar(double)の呼び出しよりもテンプレートを優先します。これは、パラメーターがintであり、int const&にキャストするためであると想定しています(const&はr値を参照できるため)。
私の質問は、「明示的に呼び出すことなく、すべてのスカラー値をサポートできる方法はありますか?」です。私は本当にすべての可能なタイプを呼びたくありません、なぜなら...まあ...それらはたくさんあるからです。charからlonglongまですべてをカバーし、揮発性とunsignedのすべての組み合わせを含める必要があります。
4を4.0に変更するだけで機能することは知っていますが、これはライブラリへのパブリックインターフェイス用であり、ユーザーが4.0
代わりに入力する必要があるの4
は汚いだけです。
c++ - コンパイラは、選択したオーバーロード関数またはテンプレート関数を教えてくれますか?
特に Linux で g++ を使用する場合、特定のステートメントに対してどのオーバーロード関数またはテンプレート関数が選択されたかを判断する方法はありますか?
より具体的には、さまざまなライブラリからのヘッダー ファイルにある可能性があるすべての可能な選択肢を知っているとは限りません。たとえ変更したとしても、関連するコードを変更できるとは思いません。