2008-10-30 11 views
7

Şablonları kullanan typedef uzun türleri mümkün mü? Örneğin:typedefs?

template <typename myfloat_t> 
class LongClassName 
{ 
    // ... 
}; 

template <typename myfloat_t> 
typedef std::vector< boost::shared_ptr< LongClassName<myfloat_t> > > LongCollection; 

LongCollection<float> m_foo; 

Bu işe yaramıyor, ancak benzer bir etki elde etmenin bir yolu var mı? Editör penceremin neredeyse tam genişliğini kapsayan bir tür tanımını yazmaktan ve okumaktan kaçınmak istiyorum.

cevap

14

Hayır, şu anda mümkün değil. C++ 0X AFAIK'de mümkün olacaktır.

aklıma gelen en iyisidir

template<typename T> struct LongCollection { 
    typedef std::vector< boost::shared_ptr< LongClassName<T> > > type; 
}; 

LongCollection<float>::type m_foo; 
+0

Bu işe yarıyor ... ancak tüm oyuncularınızı çoğaltmanız gerekecek. –

+0

Tüm oyuncularınızı çoğaltın mı? – dalle

+0

Gerçekten, tüm oyuncularınızı kopyalayın ?? – mch

3

Eğer her tip için ayrı typedefs yapmak zorunda makro yol gitmek istemiyorsanız:

typedef std::vector< boost::shared_ptr< LongClassName<float> > > FloatCollection; 
typedef std::vector< boost::shared_ptr< LongClassName<double> > > DoubleCollection; 
+0

Bu, sonuçta, std :: string'in std :: basic_string yazım hatasıdır. –

2

Hayır, ama Bir 'helper' kullanarak yakınlaşabilir, bkz. bu example.

1

Onun için soruyorsun değil tam olarak ne, ama bu gerçek duruma bağlı olarak istenen etkiyi elde etmek olabilir:

template <typename myfloat_t> 
class LongClassName 
{ 
    // ... 
}; 

template <typename myfloat_t> 
class LongCollection : public std::vector< boost::shared_ptr< LongClassName<myfloat_t> > > 
{ 
}; 

Sen ihtiyaçlarına bağlı olarak bazı kurucular veya operatörleri eklemek gerekebilir.

+0

Kötü düşünülmüş STL koleksiyonlarından türemiyor mu? Sanal işlevlere sahip değiller. Bir std :: vektörü kullanılarak LongCollection uygulamasının üye değişkeni olarak kullanılması daha güvenli olur diye düşünüyorum. Özel miras da bir seçenek olabilir. – mch

+0

İyi bir uygulama olarak kabul edilmez, ancak polimorfik kullanım için niyetiniz olmadığı sürece bahsettiğiniz problemleri ortaya çıkarmaz. –

2

Leon tarafından gösterilen çözüm, kanoniktir. Arka plan bilgisi: Buna “(şablon) metafonksiyon” denir çünkü temelde derleme zamanında değerlendirilen bir “işlev” dir. Değerler yerine, türlerle ilgilenir: Giriş türlerinin bir listesi vardır (tip argümanları) ve bir “dönüş değeri” vardır: “type” tip adını bildiren yazım hatası.

“başlatma” farklı bir söz dizimi ile de olsa, normal bir işlev çağırma benzer şekilde çalışır : örneğin Kuvvetlendirme kütüphaneler gibi ve hatta bir de STL Bu kod yapı kütüphanelerde bir sık ​​kullanılan deyim olan

// Normal function 
result = f(args); 

// Metafunction 
typedef f<args>::type result; 

Yer: allocator_type::rebind<U>::other, type typedef'in other olarak adlandırıldığı tek farkla aynı şeyi gerçekleştirir.

+0

Sanırım 'tematik metafonksiyon' demek istiyorsun. :) –

+0

Yea, artı “p”. ;-) Teşekkürler. –