問題タブ [argument-dependent-lookup]
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++ - `decltype` および ADL ルックアップと非 ADL ルックアップの混合
テストケース
が組み込みデータ型である場合、関数の戻り値の型をヘッダーからauto foo(T f)
呼び出す場合と同じにします。sin(f)
cmath
f
これは壊れています。sin(f)
withinはwithindecltype
で検索されないため、戻り値の型が であるバリアントstd
のみが見つかります。次のプログラムは、次のことを示しています。C
sin(double)
double
出力:
double
出力は、戻り値の型が常にfor foo->float
and foo->double
であることを 示唆していfoo()
ます。sin(float|double)
using std::sin
そのようなケースはすでに gremium で考慮されていたのだろうかと思いますが、それは私の質問ではありません。
質問
私の質問は:
名前が inまたは ADL-looked-up のfoo
いずれかである関数と同じ戻り値の型を持たせるための賢明な方法は何ですか?namespace std
機能しない回避策:
標準案?
is の順列を使用するenable_if
と、コードの自己文書化が妨げられます。enable_if
メタプログラミングの良い練習です。しかし、一見単純な機能をすばやく把握することは、正しいことではないため、保守性の精神に反します。
編集:私はdecltype
SFINAEをあまりあいまいに使用することもしていないので、新しいauto foo() {....}
宣言を含むC++ 14は役に立たないかもしれません。
c++ - Argument Dependent Lookup の逆の回避策は?
C++ には ADL (Argument Dependent Lookup) があり、その名前が示すように、関数のコンテキスト (名前空間) を引数 (のいずれか) のコンテキスト (名前空間) から暗示することができます。
私の質問は、何らかの手法で逆も可能かどうかです。逆に言えば、呼び出された関数のコンテキストからコンテキスト (名前空間) を推測できるかどうかを意味します。ある種の「関数依存ルックアップ」(FDL)。偽のコード:
私はそれを行う方法を理解できません。この制限は、enum
関数のオプションをエンコードするために使用される s にとって特に厄介です。この機能をシミュレートする手法があるかどうか知りたいです (C++11 も問題ありません)。偽のコード:
特にenum
s の回避策がある場合。
このコードは問題を示しています。
編集: @jrok は、ネストされた名前空間の定義に基づく回避策を提案しました。このenum
場合、このコードを取得します。これにはまだ多少のノイズがあります (実際には「依存」ルックアップはまったくありません) が、改善されています。
、 などをスコープ内で直接使用できないenum class
ため、Saturday
使用していません(実際にはコンパイルエラーが発生します)Sunday
using longname::days::_
c++ - equal() と find() の実装
次のコードでは、equal()
呼び出しを修飾する必要があります (そうしないと、「オーバーロードされた関数へのあいまいな呼び出し」が発生します)、 unqualified を呼び出すことができますfind()
。違いは何ですか?
引数依存のルックアップに関連していると思いますが (この質問を参照)、これら 2 つの呼び出しが異なる理由はまだわかりません。
c++ - 引数依存のルックアップが与えられた場合、ステートメント「std::cout << std::endl;」で使用されるときに「std::endl」が名前空間修飾を必要とするのはなぜですか?
引数依存のルックアップに関するウィキペディアのエントリを見ていましたが、(2014 年 1 月 4 日) 次の例が示されました。
...次のコメント付き:
std::endl は関数ですが、operator<< の引数として使用されるため、完全修飾が必要であることに注意してください (std::endl は関数呼び出しではなく関数ポインターです)。
私の考えでは、コメントは正しくありません (または単に不明確です)。代わりに、コメントを言うように変更することを検討しています
ADL は関数呼び出しの引数には適用されないため、std::endl には完全修飾が必要であることに注意してください。関数名自体にのみ適用されます。
ウィキペディアのコメントが間違っているというのは正しいですか? 提案された変更は正しいですか? (つまり、この例での ADL の私の理解は正しいですか?)
c++ - std::list::remove_if( function()::predicate ) の呼び出しに一致する関数がありません
では、関数内で述語を定義してstd::list::remove_if
引数として使用することは許可されていませんか?
コンパイルに失敗する次のコードを検討してください。
今、私l.remove_if( pred() );
が
これremove_if
は内部的に実行され、コンパイルされ、期待どおりに動作します。
さらに、メインの外struct pred
で定義されるように移動すると、両方のテストが期待どおりに機能します。
これは私には意味がありません。
従属名とかADLとかそういうのかなと思ったのですが… の引数が型でremove_if
はなくインスタンスです。確かに、これはテンプレート関数であり、引数の型はまだ解決されていますが..
誰かが何が、なぜ起こるのか説明できますか?
apache-flex - adl で「無効なアプリケーション記述子: 不明な名前空間: library://ns.adobe.com/flex/spark」を取得する (Flash Builder コマンドラインデバッガー)
「無効なアプリケーション記述子: 不明な名前空間: library://ns.adobe.com/flex/spark」を取得しています
flash-builder 4.6 adobe air プロジェクトに adl (コマンドライン デバッガー) を使用する場合
その非常に単純なプロジェクト
mxml ファイルは次のように始まります。
xmlns 値を " http://ns.adobe.com/air/application/3.1 "/ に交換することで解決できる、同様の問題について読みました。
値を交換すると、別のエラーが発生しました:
「無効なアプリケーション記述子: アプリケーション ファイル名には空でない値が必要です」
また、
これの全体的な理由は、air アプリを実行する必要があるプログラムがあるため、コマンドラインで flash-builder プロジェクトを実行する方法が必要だからです。
私はadlを使用しています
これが最善の方法ですか?
編集 :
記述子ファイルのコード:
c++ - 2 フェーズ ルックアップでオーバーロードされたバージョンの「スワップ」を選択できないのはなぜですか?
ユーザー定義型の関数を実装するためのベスト プラクティスに関する微妙な質問に対するこの魅力的な回答を研究しています。(私の質問は、当初、名前空間に型を追加することの違法性に関する議論によって動機付けられました。)swap
std
上記のリンクの回答からコード スニペットをここに再印刷しません。
代わりに、答えを理解したいと思います。
上記でリンクした回答は、最初のコード スニペットの下に、(その名前空間に特化するのではなく) オーバーロードに関して次のように述べています。swap
namespace std
コンパイラが別のものを出力する場合、テンプレートの「2 フェーズ ルックアップ」が正しく実装されていません。
答えは、(オーバーロードするのではなく)特殊swap
namespace std
化すると異なる結果(特殊化の場合の望ましい結果)が生成されることを指摘します。
ただし、答えは追加のケースに進みます。ユーザー定義のテンプレートクラスのスワップを特殊化します。この場合も、目的の結果は得られません。
残念ながら、答えは単に事実を述べているだけです。理由は説明されていません。
誰かがその回答について詳しく説明し、その回答で提供されている2つの特定のコードスニペットでルックアップのプロセスを説明してください:
ユーザー定義の非テンプレート クラスのオーバーロード(リンク
swap
さnamespace std
れた回答の最初のコード スニペットのように)ユーザー定義のテンプレートクラスに特化
swap
しnamespace std
ています(リンクされた回答の最後のコードスニペットのように)
std::swap
どちらの場合も、 user-defined ではなくジェネリックが呼び出されswap
ます。なんで?
(これにより、2 フェーズ ルックアップの性質と、ユーザー定義の実装のベスト プラクティスswap
の理由が明らかになります。感謝します。)
c++ - Boost.Range range_begin/end フリー関数が const 参照と非 const 参照の両方でオーバーロードされるのはなぜですか?
Boost.Rangeでこの興味深いビットを見つけました:
独立した関数range_begin/end()
を提供する場合、ドキュメントには次のように記載されています。
...
range_begin()
および参照引数range_end()
の両方に対してオーバーロードする必要がありconst
ます。mutable
実際、 のデフォルトを見てみるとend.hpp
、次のことがわかります。
両方のバージョンが同じ型を返すことに注意してください (ドキュメントに示されている例もこれを行っています)。Iterator
そもそもなぜ両方のオーバーロードが必要なのでしょうか? ADLを機能させるためですか?