問題タブ [iterator-traits]
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++ - 部分的な特殊化で使用されないテンプレート パラメーター
次のコードがあります。
今、私は の部分的な特殊化をしようとしていますiterator_traits
。私には問題ないように思えますが、g++ 4.4.5 は文句を言います:
これは完全なエラー メッセージです。
c++ - iterator_trait の典型的な使用例は何ですか
私はC++が初めてなので、ご容赦ください。STL を理解しようとしていますiterator_traits
。本「The C++ Standard Library」では、構造iterator_traits
は次のように定義されています。
T
したがって、すでに公開されているサブタイプを再公開しているように思えます。さらに先に進むと、本はそれを使用する方法の例を示しています。これは次のようなものです。
私の質問は、なぜiterator_traits
ここでこの構造が必要なのかというvalue_type
ことMyIterator
です. 私の混乱は、サブタイプの情報template <class T>
がiterator_trait
. したがって、できれば例を挙げて説明できれば、非常に役立つ iterator_traits が必要な理由と場所を教えてください。
c++ - iterator_traits の特殊化
通常のネストされた typedef ( 、など) を持たずstd::iterator_traits<>
、ソースを変更してはならないコンテナー クラス テンプレートの反復子に特化したいと考えています。基本的には、次のようなことをしたいと思います。value_type
difference_type
T
ただし、コンパイラはから推測できないため、これは機能しませんContainer<T>::iterator
。
同じことを達成するための有効な方法はありますか?
例えば:
std::count()
ここで、このクラスのインスタンスを使用して呼び出すとします。私の知る限り、ほとんどの STL 実装では、 をcount()
返しますiterator_traits<Iterator>::difference_type
。の主要なテンプレートはiterator_traits<I>
単に dotypedef typename I::difference_type difference_type
です。他のネストされた型と同じです。
この例では、 がないため、これは明らかに機能しませんContainer::iterator::difference_type
。iterator_traits
any のイテレータに特化することで、イテレータ クラスを変更せずにこれを回避できると考えましたContainer<T>
。
最後に、できれば既存のコードを変更せずに、count、find、sort などの std アルゴリズムを使用できるようにしたいだけです。iterator_traits
の全体的なポイントはまさにそれだと思いました:組み込みをサポートしていないイテレータ型の型 ( など)value_type
を指定できること。diff_type
残念ながら、のすべてのインスタンスに対して traits クラスを特殊化する方法がわかりませんContainer<T>
。
c++ - 可変個引数パラメータからのイテレータカテゴリの推定
どうすれば記入できますか???
template<class...Itrs> struct itr_category { typedef /* ??? */ type; };
だから、それはすべての'操作をサポートするtype
最も専門的なものです、そうでなければ、そのようなカテゴリが1つもない場合の失敗(のような)?iterator_traits<Itrs>::iterator_category...
Itrs
enable_if<false>::type
最も特殊iterator_category
化されているとは、次の継承で最も降順の型()を意味します。
したがって、たとえば、のようなものitr_category<InputIterator,OutputIterator,...>
は失敗します。
注意:これはで定義されているものとは異なる階層ですstd::iterator_traits
(24.3またはhttp://en.cppreference.com/w/cpp/iterator/iterator_tagsを参照):ここでは、前者だけでなく、とのforward_iterator_tag
両方から派生しています。これは、たとえばSGIドキュメント( http://www.sgi.com/tech/stl/Iterators.htmlを参照)で説明されている継承に対応します。関連する場合は、この不一致についてコメントしてください(ちなみに、これはzipイテレータの実装の一部です)。input_iterator_tag
output_iterator_tag
c++ - const_iterator と const_iterator::value_type の constness
なぜSTLで
と同じタイプです
なぜそのように設計されているのですか?最初のものはconst Tで、2番目のものはTのみであるべきではありませんか? イテレータの基礎となる const の正しい型をどのように取得することになっていますか? 独自のテンプレート クラスと特殊化を記述して、
しかし、それを保持するメンバー typedef があるべきではありませんか?
c++ - 前方反復子は出力反復子ですか?
ForwardIterators は OutputIterators である必要がありますか? 私の現在の STL 実装 (VS2012) は と の両方から派生しforward_iterator_tag
ていますが、標準 [N3485] でこの要件を見つけることができません。input_iterator_tag
output_iterator_tag
c++ - 前方出力反復子を定義する正規の方法
C++ 11で順方向出力反復子を標準的な方法で定義するにはどうすればよいですか?
標準によれば、forward_iterator は input_iterator のみです。したがって、対応するのforward_iterator_tag
は extends のみinput_iterator_tag
です。イテレータを定義するために使用std::iterator
している場合、forward-output-iterator にはどのタグを使用しますか?
forward_iterator_tag
両方を拡張するプライベートタグを定義することは標準的output_iterator_tag
ですか、またはより良い解決策がありますか?
c++ - back_insert_iterator/front_insert_iterator/insert_iterator の value_type/difference_type/pointer/reference がすべて無効なのはなぜですか?
私のプロジェクトでは、ストリームを特定のタイプの値に分割したいので、テンプレート関数を次のように実装します
TElem
呼び出すときに型を明示的に指定する必要があるため、これは厄介だと思います。たとえば、次のように書く必要があります。
(テンプレート)イテレータから値の型を取得しようとし、std::iterator_traits
次のように使用しました:
ただし、上記のコードは では機能しませんback_insert_iterator
。名前空間back_insert_iterator/front_insert_iterator/insert_iterator
内のソース コードを確認したところ、すべて.std
value_type/difference_type/pointer/reference
void
これらのタイプがすべて である理由を知りたいのvoid
ですが、これについて何か考慮事項はありますか? 別の質問は、SplitSpace
関数を呼び出すときに要素の型を明示的に指定せずに関数を実装することは可能ですか? ありがとう。