2008-10-30 9 views
7

Czy możliwe jest stosowanie długich typów z szablonami przy użyciu typedef? Na przykład:typedefs dla zajęć na szablonach?

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

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

LongCollection<float> m_foo; 

To nie działa, ale czy istnieje sposób na osiągnięcie podobnego efektu? Po prostu chcę uniknąć konieczności pisania i czytania definicji typu, która obejmuje prawie całą szerokość mojego okna edytora.

Odpowiedz

14

Nie, obecnie nie jest to możliwe. Będzie to możliwe w C++ 0X AFAIK.

Najlepszym mogę myśleć jest

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

LongCollection<float>::type m_foo; 
+0

To działa ... ale będziesz musiał duplikować wszystkich swoich lekarzy. –

+0

duplikować wszystkich swoich lekarzy? – dalle

+0

Rzeczywiście, duplikat wszystkich swoich lekarzy? – mch

3

Jeśli nie chcesz iść makro drogę trzeba dokonać indywidualnych typedefs dla każdego typu:

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

To jest przecież, jak std :: string jest typedef z std :: basic_string. –

2

No, ale ty można zamknąć za pomocą typu "pomocnika", patrz ta example.

1

Nie jest dokładnie to, co prosisz, ale może to osiągnąć pożądany efekt w zależności od aktualnej sytuacji:

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

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

może trzeba dodać kilka konstruktorów lub operatorów w zależności od potrzeb.

+0

Nie pochodzi ze zbiorów STL uważanych za złe? Nie mają funkcji wirtualnych. Myślę, że bezpieczniej byłoby wdrożyć LongCollection w kategoriach std :: vector, używając jako zmiennej składowej. Dziedziczenie prywatne może być również opcją. – mch

+0

Nie jest to uważane za dobrą praktykę, ale w rzeczywistości nie stwarza problemów, o których wspominasz, o ile nie zamierzasz używać polimorfizmu. –

2

Rozwiązanie przedstawione przez Leona jest kanoniczne. Trochę wiedzy w tle: nazywa się to metafunkcją "(szablonową)", ponieważ jest to zasadniczo "funkcja", która jest oceniana podczas kompilacji. Zamiast wartości, zajmuje się typami: Istnieje lista typów danych wejściowych (argumenty typu) i istnieje "wartość zwracana": Typedef, który deklaruje nazwę typu "typ".

„Wezwanie” działa w sposób analogiczny do normalnej funkcji wywołaniu, chociaż w innym składnię:

// Normal function 
result = f(args); 

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

Kod konstruktem jest często stosowany idiom bibliotek takich jak biblioteki ciśnienia i nawet w STL w jednym miejsce: allocator_type::rebind<U>::other osiąga to samo z tą różnicą, że typedef type nazywa się other.

+0

Myślę, że masz na myśli "metafunction temlate". :) –

+0

Tak, plus "p". ;-) Dzięki. –

Powiązane problemy