2011-01-27 15 views
5

Standart kütüphane veya Boost içinde, özel bir STL uyumlu Diziyi gerekli yazımlarla (size_type, value_type, vs ...) doldurmak için bir çeşit yardımcı temel sınıf var. boost::iterator_facade gibi bir şey düşünüyorum, ancak kapsayıcılar için.STL uyumlu kapsayıcı için yazım hataları typedefs

Kendi başıma dönecektim ama böyle bir şeyin zaten varolmadığından emin olmak istedim.

GÜNCELLEME:

Bu benim ile geldi yarar temel sınıftır, durumunda herkes yararlı bulur: Özel bir kabın altında yatan konteynırın

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 basitçe "yankıları" iç içe typedefs. Gerçekten hiçbir şey yok. Varsa bile typedef typename base::size_type size_typetypedef typename base::size_type size_type'a sahip olsanız bile,

+0

Kullanıcılar, alternatiften daha kolay olduğu için value_type ve yineleyiciyi kullanırlar, ancak ben genellikle value_type & başvuru yerine, örneğin kullanırım (ve vektör kötülüktür). Bu iç içe geçmiş typedeflerin sizin için avantajlı olduğundan emin misiniz? Normalde, öğeleri bir const olarak nitelenecekleri işlevlere geçiririm ve iç içe const_reference typedef'e hiçbir zaman dokunulmaz. –

+0

@Fred: BOOST_FOREACH, destek aralıkları, std :: back_insertion_iterator vb. Gibi şeylerle uyumlu olarak kapsayıcım için endişeleniyorum. Tüm yazım hatalarını yalnızca minimum düzeyde bir alt kümesi sağlamaya ihtiyacım varsa, bilmek isterim hangi. Denemek ve öğrenmek için yeterince kolay olduğunu düşünüyorum. –

+0

Doğru, ancak genel yardımcı programlar genellikle agnostik olarak yazılır; 0x auto bunun için harika. :) –

cevap

1

. , çok kazanacağınız gibi görünmüyor.

+0

Yazım hatalarının sınıf beyanında görünmesini istiyorsanız, yalnızca türetilen sınıfta yeniden yazmanız gerekir. Özel kapsayıcının kullanıcıları, temel sınıftan miras alınan tüm typedefleri görmeye devam ederdi. Boost :: iterator_facade 'bu şekilde çalışır. –

+0

@Emilie Biliyorum, ancak kapsayıcılar varsayarak bu türleri kullanacak operatörler ve başka şeyler sağlamanız gerekiyor. – Anycorn

+0

@aaa: Her zaman 'T', 'T &', const T & ', vb. Kullanabilirim. Gerçekten ihtiyacım olan tek yazım hataları (bildirim içinde)' yineleyici' ve 'const_iterator'. Bununla birlikte, üye fonksiyon bildirimlerinde "referans", "değer_sayısı" vb. Olması, dokümantasyon bakış açısından daha güzel olduğunu itiraf ediyorum. –