92991


C++のSTLコンテナ（上の例ではvector)は、なぜ内部でtypedefを多用しているのでしょうか。  
member typesをtypedefで新たに新しい型名として定義してしまうことによって、誤用の可能性が高まるのではないかと思いました。  
あえて別の型名で定義し直す理由を教えていただきたいです。

[code]

    template<class T, class Allocator = std::allocator<T> >
        class vector {
        public:
            /* member types */
            typedef T value_type;
            typedef Allocator allocator_type;
            typedef std::size_t size_type;
            typedef std::ptrdiff_t difference_ptr;
            typedef value_type &reference;
            typedef const value_type &const_reference;
            typedef typename Allocator::pointer pointer;
            typedef typename Allocator::const_pointer const_pointer;
            typedef pointer iterator;
            typedef const_pointer const_iterator;
            typedef ft::reverse_iterator<iterator> reverse_iterator;
            typedef ft::reverse_iterator<const_iterator> const_reverse_iterator;
    
[/code]


CC BY-SA 4.0
2022-12-24T14:26:19.237
92990
2022-12-26T06:13:44.970
2022-12-24T14:41:22.443
3060
55503
question
c++
C++のSTLコンテナ内でtypedefを多用して、member typesを定義しているのはなぜですか？


実行環境の事情に合わせて処理系 (に付属するライブラリ) は適切な型を選択できるようにするためです。

たとえばあなたが見た実装で `std::vector<T>::size_type` が `std::size_t`
なのはその環境ではそう実装しているに過ぎず、言語仕様でそうしなければならないと決まっているわけではありません。


CC BY-SA 4.0
2022-12-24T14:50:40.163
92991
2022-12-24T14:50:40.163
3364
92990
answer


> C++のSTLコンテナ（上の例ではvector)は、なぜ内部でtypedefを多用しているのでしょうか。  
>  あえて別の型名で定義し直す理由を教えていただきたいです。

短い答え：C++標準ライブラリ仕様の要請(Requirements)の一部です。

* * *

C++標準ライブラリの各種コンテナクラスでは、外部インタフェースの一部として特定の型定義を提供することが要求されます。

例えば、全ての標準コンテナ`Container`クラスは `Container​::​iterator`
および`Container::const_iterator`
という型名でイテレータ型を提供しなければなりません。これにより標準コンテナを利用するジェネリックコード（関数テンプレートの内部実装）において、安定してイテレータ型にアクセスできるようになります。

[code]

    template <typename Container>
    void generic_proc(Container& c)
    {
      // 未知のコンテナ型に対するイテレータ型が必要であれば
      // Container::iterator と記述すればよい。
      Container::iterator itr = c.begin();
      ...
    }
    
[/code]

C++言語仕様の進化よって [型推論(`auto`)](https://cpprefjp.github.io/lang/cpp11/auto.html) や
[式からの型情報取得(`decltype(c.begin())`)](https://cpprefjp.github.io/lang/cpp11/decltype.html)
も可能になりましたが、C++標準ライブラリは「ネストした型情報という外部インタフェース」を提供し続けています。


CC BY-SA 4.0
2022-12-26T06:13:44.970
93014
2022-12-26T06:13:44.970
49
92990
answer