2011-01-27 11 views
5

標準ライブラリまたはBoost内に、カスタムSTL互換シーケンスに必要なtypedef(size_type、value_typeなど)を設定するためのユーティリティベースクラスがあります。私はboost::iterator_facadeのようなものを考えていますが、コンテナのためです。STL互換コンテナの定型句

私は自分自身をロールアップしようとしていましたが、そのようなことがまだ存在していないことを確認したかったのです。

UPDATE:

これは私が思い付いたユーティリティの基本クラスで、場合に誰でも重宝:

template <class C> 
class ContainerAdapter 
{ 
public: 
    typedef C::value_type value_type; 
    typedef C::reference reference; 
    typedef C::const_reference const_reference; 
    typedef C::const_iterator iterator; 
    typedef C::const_iterator const_iterator; 
    typedef C::difference_type difference_type; 
    typedef C::size_type size_type; 

protected: 
    typedef C::container_type; 
}; 


// Usage 
class MyCustomContainer : public ContainerAdapter< std::vector<int> > 
{ 
... 
}; 

ContainerAdapterは、単純にカスタムコンテナの根底にあるコンテナの入れ子になったのtypedefを「エコー」。本当にそれには何もありません。

+0

人々はvalue_typeとiteratorを代わりに使用するより簡単ですが、私は通常、参照の代わりにvalue_type&を使用します(たとえば、ベクトルは悪です)。他のネストされたtypedefをあなたに有利に提供していますか?通常、私はアイテムを関数に渡します。ここでは、それらはconst&とにかくバインドされ、ネストされたconst_reference typedefは決して扱われません。 –

+0

@Fred:BOOST_FOREACH、boost range、std :: back_insertion_iteratorなどのコンテナと互換性があるかどうか気になります。すべてのtypedefの最小限のサブセットを提供する必要がある場合は、それは。実験して調べるのは簡単だと思います。 –

+0

真実だが一般的なユーティリティは、通常、不可知論的に書かれている。 0x autoはそれに最適です。 :) –

答えて

1

でも存在していても、まだtypedef typename base::size_type size_typeである必要があります。 あなたはあまり得られないようです。

+0

typedefをクラス宣言内に表示する場合は、派生クラスでre-typedefを実行するだけです。カスタムコンテナのユーザーには、基本クラスから継承されたすべてのtypedefが引き続き表示されます。これは 'boost :: iterator_facade'の働きです。 –

+0

@エミリー私は知っていますが、コンテナの場合、それらのタイプを使用する演算子やその他のものを提供する必要があると仮定します。 – Anycorn

+0

@aaa:私はいつも 'T'、' T& '、' const T& 'などを使うことができます。本当に(宣言内で)必要な唯一のtypedefは' iterator'と 'const_iterator'です。しかし、私は、メンバ関数の宣言で 'reference'、' value_type'などをドキュメントの観点から見た方がきれいだと認めます。 –

関連する問題