2011-08-02 14 views
66

Jak powinienem być typedef a template class? Coś jak:Jak wpisywaćf szablon klasy?

typedef std::vector myVector; // <--- compiler error 

znam 2 sposoby:

(1) #define myVector std::vector // not so good 
(2) template<typename T> 
    struct myVector { typedef std::vector<T> type; }; // verbose 

Czy mamy nic lepszego w C++ 0x?

+0

Dlaczego tego chcesz? Jaki jest przypadek użycia? –

+2

Wdrażam coś, w czym mam włączoną "klasę szablonów". Najpierw zaimplementuję go z klasami standardowymi, a następnie chcę przejść do własnych klas niestandardowych. Tak więc chcę, aby ten przełącznik był tak prosty, jak zmiana "typedef". – iammilind

+0

Muszę się zgodzić z Davidem. Dlaczego chcesz to nazywać? Indywidualność jest główną przyczyną nieczytelnego i niemożliwego do utrzymania kodu. Jednak podałeś dobry powód, "Abstrakcja". Problem ze stl to API. Zapobiega określonym optymalizacjom. Utrzymywanie tego samego API i myślenie, że możesz zrobić to lepiej, jest niefortunne. Nie trzeba pisać całego dnia, by napisać swoją własną tablicę. po prostu zrób to i skończ z tym. Lub po prostu użyj STL i zabierz się za swoje życie. – Dan

Odpowiedz

108

Tak. Nazywa się "alias template" i jest nową funkcją w C++ 11.

template<typename T> 
using MyVector = std::vector<T, MyCustomAllocator<T>>; 

Wykorzystanie będzie wówczas dokładnie tak, jak można się spodziewać:

MyVector<int> x; // same as: std::vector<int, MyCustomAllocator<int>> 

GCC wspiera go od 4,7 i Clang posiada go od 3,0.

+0

To fajne, ale nie mogę go zweryfikować za pomocą mojego gcc4.6 lub 4.5 (http://www.ideone.com/I8kbA). Czy kompilujesz z MSVC? – iammilind

+0

Najpierw musisz poczekać, aż C++ 0x zostanie zaakceptowane. Następnie musisz poczekać, aż twórcy kompilatorów faktycznie wdrożą standard. –

+1

"Połów jest taki, że nikt jeszcze go nie obsługuje". Jest w klangie (svn trunk) od kilku miesięcy. –

14

W C++ 03 można dziedziczyć z klasy (publicznie lub prywatnie), aby to zrobić.

template <typename T> 
class MyVector : public std::vector<T, MyCustomAllocator<T> > {}; 

Trzeba wykonać nieco więcej pracy (w szczególności skopiować konstruktorów, operatorów przypisania), ale jest to całkiem wykonalne.

+2

@iammilind: uprowadzenie zamiast ochrony przed spadkiem czyni je bardziej prawdopodobnymi (* jak to pytanie zostało wznowione! * Rodzaj argumentacji). Jestem jednym z tych, którzy otwarcie sprzeciwiają się dziedziczeniu z kontenerów STL ... ale w tym przypadku nie ma zbyt wielu alternatyw. Myślę, że najlepszą opcją jest ponowne przemyślenie, dlaczego chciałbyś to zrobić w pierwszej kolejności ... –

+0

@ David Rodriguez zgodził się, dlaczego chcesz. Jeśli w dużym stopniu korzystasz z wektorów opartych na innym alokatorze, szablon typedefs byłby bardzo pożądany. Prywatne dziedziczenie (tj. Zaimplementowane w warunkach) jest w porządku, ale tylko wtedy, gdy istnieje powód, aby go dziedziczyć ... co zwykle nie ma miejsca. – dascandy

+0

Być może nie dla std :: vector , ale ogólnie widzę, jak to może być przydatne. Załóżmy, że masz typ LongName (lub długi łańcuch szablonów zagnieżdżonych); używanie skrótu może być przydatne. Jeśli używasz tego typu dla jednego lub dwóch różnych T, możesz je wpisać.Ale jeśli masz wiele typów T, to wpisanie ich wszystkich może być tak długie, jak używanie nazwy bezpośrednio, a jednak używanie nazwy jest boleśnie długie. – bartgol