テンプレートクラスstd::iterator
は、C++では非推奨に設定されています17。なぜそうなのか? std::iterator_traits
が有効であることを確認する便利な方法でした。特に、デフォルトのテンプレート引数を使用できる場合は特に便利です。 C++ 17でそれを行う他の方法はありますか?std :: iteratorはなぜ非推奨ですか?
答えて
the proposal that suggested its deprecationから:
イテレータクラスを作成するための補助として、オリジナルの標準ライブラリはにiterator_traitsにより、すべてのイテレータの予想5つのtypedefの宣言を自動化するイテレータクラステンプレートを提供。これは、その後
std::ostream_iterator
の仕様では、たとえば、ライブラリ自体に使用された:template <class T, class charT = char, class traits = char_traits<charT> > class ostream_iterator: public iterator<output_iterator_tag, void, void, void, void>;
void
引数の長いシーケンスは、単にクラス定義自体に期待されるのtypedefを提供するよりも、読者にはるかに少ない明らかですC++ 14で設定されたパターンに従い、現在の作業草案が取り組んでいるアプローチです。ここでは、ファンクタのライブラリ全体での導出を非推奨にしました(unary_function
およびbinary_function
)。イテレータテンプレートには、一般的な使用法のように、依存しない基本クラスがあります。つまり、クラス内から名前を参照しているときや、そのメンバ関数。これは、次の簡単な使い方が動作しない理由を理解しようと驚いユーザーにつながる:
#include <iterator> template <typename T> struct MyIterator : std::iterator<std::random_access_iterator_tag, T> { value_type data; // Error: value_type is not found by name lookup // ... implementations details elided ... };
だけで明確にする理由はもはや任務標準イテレータadapatorsように標準ライブラリの仕様を更新するLWGを説得するのに十分でした
std::iterator
から派生しているので、このテンプレートは標準自体の中でそれ以上使用されません。したがって、非推奨の強力な候補のように見えます。
また、STLの推論をLWG 2438に表示することもできます。 (H/T T.C.)は実際に、それを行うためのいくつかの他の方法については
。あなたは基本的にstd::iterator
の独自のバージョンを実装することができます(あまりにも難しくありません)。またはこれらのtypedefを手作業で書き出すことができます(あまりにも難しくなく、実際はわかりやすくするためです)。
[LWG 2438](https://timsong-cpp.github.io/lwg-issues/2438)のSTLの議論は健全であるようにも見えます。その名前はユーザーを誤解させるかもしれません(特に*他のプログラミング言語から)派生が必須であると考えること、または 'std :: iterator'を受け入れる関数を書くことが意味があることを考えてください。 –
- 1. なぜorg.hibernate.cache.Cacheは非推奨ですか?
- 2. なぜbuildSessionFactory()は非推奨ですか?
- 3. PythonでMutableStringはなぜ非推奨ですか?
- 4. JDK 9のアプレットはなぜ非推奨ですか?
- 5. なぜTabActivityは非推奨(理由)ですか?
- 6. なぜWeakMapのclear()メソッドは非推奨ですか?
- 7. JavaScript - なぜ非推奨でないのですか
- 8. エラー: 'テンプレート<class>クラスstd :: auto_ptr'は非推奨です
- 9. 'gtk_widget_override_font'は非推奨です
- 10. setTabSFromPagerAdapterは非推奨です
- 11. カメラは非推奨です
- 12. FragmentActivity.getSupportMediaController()は非推奨です
- 13. タイプギャラリーは非推奨です
- 14. AppInvite.AppInviteApi.getInvitation()は非推奨です
- 15. WakefulBroadcastReceiverは非推奨です
- 16. NSGregorianCalendarは非推奨です
- 17. ConnectivityManager.CONNECTIVITY_ACTIONは非推奨です
- 18. stringByAddingPercentEscapesUsingEncodingは非推奨です
- 19. getMap()は非推奨です
- 20. cell.imageは非推奨です
- 21. replaceGlyphAtIndexは非推奨です
- 22. GameObject.rendererは非推奨です
- 23. $ HADOOP_HOMEは非推奨です
- 24. AuthorizationExecuteWithPrivilegesは非推奨です
- 25. PlacePicker.getPlace()は非推奨です
- 26. ProgressDialogは非推奨です
- 27. livequeryは非推奨です
- 28. 'sharedDispatcher'は非推奨です
- 29. ConstantScoreRangeQueryは非推奨です
- 30. OnCameraChangeListener()は非推奨です
はい、同じことをC++ 17で実行する便利な方法があります。同じことを_するだけです。 「廃止予定」とは、将来**廃止される可能性のある** **のみを意味します。それはあなたがそれを使うことができないこと、あるいはいつもやったことをしないことを意味するものではありません。 –
@PeteBecker:しかし、もしそれが非難されているのであれば、なぜプログラマは次のバージョンでそれが消え去るかもしれないのでしょうか?それがとても便利だったのであれば、なぜこれは非難されるのですか? – Nawaz
@Nawaz - それは疑問を後ろ向きにします。それが標準の場合、なぜそれを使用しないでしょうか? **スタンダードの何か**は将来、潜在的に消える可能性があります。はい、廃止予定のものはなくなる可能性があります。 C++では非推奨となっているCヘッダーを考慮してくださいが、実際問題としては決して遠ざかりません。 –