問題タブ [reference-wrapper]
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++ - std::reference_wrapper よりも優れた C++ 参照をエミュレートする型
私は、C++ 参照のように動作するクラスを設計していますが、いくつかの余分な機能 (簿記) を行います。
std::reference_wrapper<T>
最初は良いモデルだと思いました。しかし、しばらくしてstd::reference_wrapper<T>
、割り当てが内部ポインターを再バインドするため、原則としても C++ 参照として動作しないことに気付きました。
もちろん、自分のクラスの動作を変更することはできますが (再バインドしないように)、参照をエミュレートするクラスが既に存在する可能性があります。たとえば、「std::real_reference<T>
」のようなもの。
参照をより厳密にエミュレートするクラス (標準かどうか) はありますか?
これも役立つと思います。たとえば、多くの場所で
std::vector<std::reference_wrapper<T>>
の代替として提示されているstd::vector<T&>
ことがわかりますが、セマンティクスは異なりますが、いくつかの変更で実現できるため、これは誤解を招く可能性がありますstd::vector<std::real_reference<T>>
。
「完璧な」参照ラッパーが可能であれば、参照はポインターで実装でき、必要はなく、すべての点でまったく同じようにT&
機能するライブラリ機能が必要になるだけだと思います....reference<T>
T&
...つまり、言語を使用すると、型に属性を「オーバーロード」して&
、言語参照の代わりにカスタム型を生成できることを意味します。たとえばusing mytype& = custom_reference_emulator_of_mytype
。
c++ - std::vector の変換方法> std::vector へ
ローカルがあり、その要素の実際のコピー(つまり)std::vector<std::reference_wrapper<T> >
を返したいと考えています。ループよりも良い方法はありますか?std::vector<T>
例:
c++ - これは reference_wrapper の有効な使い方ですか?
私が理解していることから、C++ テンプレート クラスreference_wrapper
は、通常の参照に対するコピー コンストラクターと代入演算子を本質的に提供するため、コンテナーとタプルの参照に役立ちます。つまり、null を許可しないポインターのように思えます。
その理解に基づいて、std::cout
デフォルトで文字列を出力するクラスを実装しようとしましたが、ユーザーはそれをファイルでオーバーライドできます。これは、実際のプログラムではおそらく役に立ちません。ここでは例として使用します。最新の C++ での演習として、new/delete の使用を避け、RAII 機能に依存したいと考えました。クラスは次のようになります。
reference_wrapper
すべてが期待どおりに機能しますが、これは私がオンラインで見つけた例とはまったく異なる使用例です。これは の有効な使用と見なされますreference_wrapper
か? 自動リソース管理や RAII などの最新の C++ 機能を使用するより良い代替手段はありますか?
c++ - reference_wrapper のベクトルをソートできないのはなぜですか?
の並べ替えられたビューがstd::vector<std::chrono::milliseconds>
必要ですが、元のコンテナーを変更したくありません。std::reference_wrapper
これには完璧なようで、整数のベクトルに対してはうまく機能します。
この小さな例を作成しました:
これにより、期待される出力が生成されます(ただし、sorted_durations
コメントアウトされているため、もちろんソートされていません):
ご覧のとおり、整数の元のベクトルは、numbers
実行された並べ替え操作によって変更されません。sorted_numbers
これは、まさに私がsorted_durations
ベクトルにも望んでいることです。しかし、その行のコメントを外すと、コンパイラは私に非常に腹を立て、それが何を伝えようとしているのか理解できないことを認めなければなりません。私のコンパイラは clang++ バージョン 3.8 で、サンプル プログラムを次のようにビルドします。
そして、ここに私が得るエラー出力があります:
実際にはもう少し長く続きますが、stackoverflow ではエラーの 55000 文字すべてを投稿できません。
私が間違っていること、またはこれが単に不可能な理由を誰かに説明してもらえますか (その場合)。
c++ - reference_wrapper オブジェクトのベクトルを予約します。どのように可能ですか?
std::reference_wrapper
デフォルトでは構築可能ではありません。したがって、次のいずれも書くことができません。
しかし、驚いたことに、オブジェクトstd::vector::reserve
のベクトルのメンバー関数を呼び出して、std::reference_wrapper
その容量を効果的に変更できます。
std::reference_wrapper
デフォルトのコンストラクターがないため、これはどのように可能ですか?
c++ - std::reference_wrapper の実装
ここの実装を見ながらstd::reference_wrapper
コンストラクターと演算子は明らかですが、この部分は理解できませんでした
誰かが私のためにそれを単純化できますか...いただければ幸いです
編集:そしての有用な例を与えることは素晴らしいことoperator()
ですstd::reference_wrapper
c++ - reference_wrapper 実装の詳細
このテンプレート化された operator() は、reference_wrapper 実装でどのように機能しますか?
ここに行きます:
それにしても、なぜ operator() が必要なのでしょうか? 使い方?
返される内容「result_of::type」は何ですか?
(ArgTypes && ..) とは??
呼び出す(取得する)???
このコードは別の惑星の C++ のように見えます :)